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程式,僅僅理解組成該程式的符號是不夠的。程式設計師還必須理解這些符號是如何組合成宣告 表...