我正在嘗試在測試嚴格的 C90一致性時使用gcc標誌的組合。根據之前的帖子:GCC options for strictest C code?,我應該只需要一個--std = c90。嚴格C90代碼的GCC選項?
但這裏是我的嘗試:
$ cat t.c
#include <stdint.h> /* added in C99 */
int main()
{
uint64_t t;
return 0;
}
$ gcc -std=c90 -ansi -pedantic t.c
上述不正常工作(沒有警告/錯誤的產生)。
請問的人知道:
- GCC標誌有嚴格的ISO/IEC 9899:1990的一致性
- 不同的編譯器(TCC,鐺......)與不同組標誌?
編輯:
對不起,我的措辭,是的,我真的想模仿嚴格符合C90編譯器,換句話說,如果代碼嘗試使用後新增任何功能應該失敗(C99來心神)。因此pthread
包含標頭應該編譯時會發出警告GNU/GCC calls C90 mode(就像stdint.h頭文件應該產生一個沒有C99的警告)。 -pedantic很好地警告我使用long long
,我不明白爲什麼它不應該警告我關於uint64_t
。
我用的ISO/IEC 9899的術語:
在1990年,ANSI C標準(帶格式的變化)是由 通過:1990從引國際標準化組織(ISO)作爲ISO/IEC 9899:1990,其有時被稱爲C90。因此,術語「C89」 和「C90」是指相同的編程語言。
EDIT2:
GCC文件實際上是相當清楚的:
某些功能是被接納爲C90模式 擴展C99標準的一部分,有些功能是一部分C9 標準被接受爲C90和C99模式下的擴展。
所以我的問題是改寫成:
- 是否有一個編譯器+標準包括一個Linux系統,它嚴格遵循C90的頭?
請注意,C90是在標準ISO/IEC 9899中指定的。您要求符合ISO/IEC 9945-1這是POSIX標準。 – Lundin 2014-10-22 07:41:44
我還沒有聽說過一個編譯器,可以讓你檢查這個。一些編譯器,例如gcc和clang以及一個3. party標準庫一起使用時間很長,以支持所要求的標準,尤其是在語言級別,但它們並不意味着要成爲合規性檢查器。對於庫特性,它更加不實際,因爲C允許使用非標準庫/頭文件,所以沒有什麼能阻止執行文件將stdint.h提供到C89編譯器 - 例如gcc和clang不提供庫/頭文件 - 這留給了3方(通常是linux上的glibc) – nos 2014-10-22 08:10:42
你說*應該*發出警告,你的證明在哪裏?在梳理完標準後,我沒有看到它說需要編譯器發佈診斷的地方。 – 2014-10-22 08:10:50