2011-07-14 65 views
6

這裏是一個警告,我和很多人在那裏在網絡上,看到C++代碼運行GCC時:爲什麼gcc的選項「-Wstrict-prototypes」對C++無效?

cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++ 

的警告文字是很清楚的:「C++」是不是在集合[阿達/ C/ObjC],所以我毫不懷疑gcc爲什麼在編譯C++代碼時給出這個警告。 (僅供參考,儘管使用C++代碼打開此標誌的原因是因爲它主要是C代碼,但我們選擇了嚴格的(高級別)警告選項列表,但我們添加了一些C++代碼。

我的問題是:爲什麼不是這樣的警告適用於C++

的警告選項GCC的文檔,從http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Warning-Options.html是:

-Wstrict的原型(C和Objective-C只)如果函數被聲明或定義而沒有指定參數類型,則會發出警告( 舊樣式函數定義在沒有警告的情況下被允許,如果 的聲明指定的參數類型之前。)

現在我只知道我忘了什麼東西顯然對C++的,但不C++還需要在原型指定參數類型的功能呢?誠然,這些函數原型通常在類聲明中,因爲函數通常是成員函數,但是不是原型還是需要的?或者即使他們只是良好的做法,那麼爲什麼gcc不會提供這個選項的支持?或者,如果沒有,通過C++的並行選項?

回答

8

我想這是因爲C++需要嚴格的原型作爲語言的一部分,所以選項是多餘的。爲什麼這使得GCC需要抱怨它超出了我的想象。

我在我的構建腳本中爲小樣本/測試C或C++程序設置了該選項,並且警告類型刺激了我 - 似乎沒有理由警告,因爲語言的默認行爲是我要求。但是它就在那裏,所以有一天當它激怒我時,我會修復我的腳本,以免打擾C++構建的這個選項。

+1

所以_warning_對於C++來說是多餘的,因爲如果我違反了C++代碼中的要求,編譯器會正確地報告_error_(並且編譯失敗)? – talkaboutquality

+0

是的,因爲你提到的原因,在C++中對於缺少原型的警告是多餘的。就我而言,用於C++的'-Wstrict-prototypes'的GCC警告問題也是多餘的;就我而言,gcc可以默默地忽略C++的選項。 –

3

它隱含在C++中,因爲在不指定參數類型的情況下聲明/定義一個函數是標準的非法C++(是的,這是C和C++之間的區別之一,它使得C++不是真正的超集)。

這是合法的C99,但不合法的C++ 03:

void foo(x, y) 
    int x; 
    char *y; 
{ 
    // ... 
} 

GCC給出了下這是一個警告,如果有-Wstrict-prototypes編譯。

3

它是C++標準所要求的,所以它沒有打開或關閉的意義:它的總是在的語言中。

0

另一個有趣的特殊情況:

extern int foo(); 

採用C語義該聲明指定的不完整類型FOO,其中的參數的數量和類型仍然是不確定的。 C99/C11完全合法,但-Wstrict-prototypes在C中對此聲明發出警告。

通過C++語義,該聲明爲foo指定了一個完整類型,作爲不帶任何參數的函數(即它相當於extern int foo(void))。因此-Wstrict-prototypes與C++中的這種情況無關。