C C 函式原型(或函式宣告)的相同點與不同點

2021-06-25 10:31:34 字數 2513 閱讀 9437



1、c++

必須要有函式原型,

c語言可選

1.1 c

語言

1 #include 2

3 int main(intargc, char *argv) 4

9 10 void func1()

//warning: conflicting types for 『func1』

11 {}

12 13

voidfunc2()

//warning: conflicting typesfor 『func2』 14

{} 該段**用

gcc編譯,沒有

error

,只有兩個

warning

。注意warning

的位置不是在5、

6行,而是在10、

13行!

warning

的告警型別是

conflictingtypes

,而不是函式未找到,這是為什麼呢?

實際上,在函式呼叫前,如果沒有對函式進行宣告,則編譯器會把第一次遇到的該函式形式(函式定義或函式呼叫)作為函式的宣告,並將函式型別預設為

int

型。編譯器編譯上述**,執行到第

5行處,便會將函式

func1

的函式原型當做

intfunc1();

編譯到第

10行處,發現

voidfunc1()

便會告警型別衝突(返回型別

int和

void

衝突)。如果將第

10行,第

13行處的函式返回型別改為

int,則編譯器不會出現告警。

1.2 c++

1

#include 2

3 int main(intargc, char *argv) 4

9 10 void func1()

11 {}

12 13

voidfunc2() 14

{} 該段**用

g++編譯後,第5、

6行會error

。說明c++

中必須要用函式原型

!也許有人會說將

10-14

行**放在

main

函式前,就不會產生

error

。其實,如果被呼叫函式的定義出現在主調函式之前,可以不必加以宣告。因為編譯器已經預先知道了已定義的函式型別,會根據函式首部提供的資訊對函式的調用作正確性檢查。

2、函式宣告的引數列表

引數列表,c語言

c++語言要求一致。這裡不分開討論。

1#include 2

3void func1(int); 4

void func2(int c); 5

6int main(int argc, char *argv) 7

1213 voidfunc1(int a)

14 {}

1516

voidfunc2(int b) 17

{} (a

)函式原型不要求提供變數名,有型別列表就足夠了。比如第3行

voidfunc1(int);(b

)原型中變數名相當於佔位符,不必與函式定義中的變數名相同。比如第4行

voidfunc2(int c);

3、void

與沒有引數

3.1

在c++中,括號為空與在括號中使用void是等效的——意味著函式沒有引數。

#include

void func1(void);

void func2();

int main(int argc, char *argv)

void func1()

{}void func2(int a)

{}使用

g++編譯會產生

error

:undefined reference to `func2()'

3.2 在c語言中,括號為空則意味著不指出引數——這也意味著引數列表可以在後面的函式定義中列出。

#include

voidfunc1();

voidfunc2();

intmain(int argc, char *argv)

voidfunc1(void){}

voidfunc2(int b)

{}使用

gcc編譯,沒有告警(即便加上

-wall

選項)。

上述**所使用的編譯器均為

gcc/g++ (gcc)4.4.4

。參考文獻:1、《

c++ primer plus

中文版(第

6版)》

2、函式定義與宣告

類內靜態函式和全域性靜態函式的相同點和不同點

1 全域性靜態函式只在本編譯單元有效。2 類靜態函式,對比普通成員函式,沒有this指標,不能訪問非static成員。3 要說二者相同點,都是c 名字控制的手段 全域性靜態函式被侷限在乙個編譯單元,通俗的將就是在乙個cpp檔案中定義的全域性靜態函式在另乙個cpp檔案中不能被呼叫。例程如下 inclu...

C C 中函式宣告的作用

參考 一直想不明白,函式宣告的作用。在include中我們只是把函式的宣告放入 了,呼叫函式的具體實現還是要看函式的定義,那麼include函式宣告到底有什麼作用呢?按理說我只要能正確鏈結對應的函式定義就可以了呀?在參考的部落格中看到這麼一段話 其實函式宣告的作用是讓編譯器幫你檢查你呼叫函式時有沒有...

關於C C 函式指標宣告的理解

前言 由於最近對函式指標的理解比較模糊,所有又重新學習了一把關於函式指標的知識,參考了很多書籍和網上的文章。現在本人進行一下分享和總結。本文的其實只是整理和總結別人現有的文章,作為備用參考文件。正文 要理解乙個c程式,僅僅理解組成該程式的符號是不夠的。程式設計師還必須理解這些符號是如何組合成宣告 表...