2010-01-30 28 views
3

我最近將一個項目從GCC移植到了clang(我在其中修正了一些C GNU-isms)。這讓我想到:C GNU-isms(GCC中支持的C語言的擴展,哪些不是標準化的)存在?有沒有全面的清單?C GNU-isms存在什麼?

回答

8

這是一個非常全面的列表直接從GCC的網站。似乎有相當多的,所以我祝你好運篩選!

http://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/C-Extensions.html

+1

我看到你拒絕建議RTFM ;-) – Clifford 2010-01-30 09:27:56

+0

值得注意的是,許多這些擴展實際上是C99的一部分。他們只是GNU擴展,GCC允許您在C89模式下使用它們。例如:https://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/Compound-Literals.html#Compound-Literals – Brendan 2014-10-22 13:41:42

0

雖然有很多的擴展,我推遲到測試版的答案是,這是不可能的項目依賴於很多人。可以在GNU構建中禁用擴展,因此只需執行該操作,就可以提前警告代碼庫中的任何潛在不兼容問題。

您可能會遇到其他問題,例如GCC支持大多數C99功能,而一些流行的編譯器不支持(Microsoft VC++專門)。因此,當您測試代碼庫時,您可能也想要禁用C99功能。

+0

實際上,在Windows以外的(非嵌入式)系統上,大多數編譯器都是這樣做的支持大部分C99功能。這是comp.std.c新聞組當前存在爭議的主題,因此您也可以參閱groups.google.com。 – 2010-01-30 19:29:32

+0

@Jonathan:這可能是因爲在非Windows系統(如OSX和Linux)上,事實上的標準編譯器*是* GCC。我實際上是一個嵌入式系統開發人員,並且支持許多C99功能(特別是像新頭文件這樣的免費功能)並不罕見。事實上,由於GCC在嵌入式系統中也很普遍,所以這很常見。 – Clifford 2010-01-31 09:27:04

+0

即使是非GCC編譯器也支持大多數服務器級系統上的大部分C99(小心避免嵌入式空間,規則可能不同,並且我不能很好地洞察當前的實用性),而且25+這些年來的經驗基本上沒有幫助)。 – 2010-01-31 18:46:56

0

我發現的最好的GNUisms之一是填充結構時顯式的鍵聲明。

struct canmsg_t { 
     short  flags; 
     int  cob; 
     canmsg_id_t id; 
     unsigned long timestamp; 
     unsigned int length; 
     unsigned char data[CAN_MSG_LENGTH]; 
}; 

canmsg_t msg = 
{ 
     ["flags"] = 0x00; 
     ["cob"] = 0; 
     ["id"] = 0x534; 
     ["timestamp"] = 0; 
     ["length"] = 1; 
     ["data"] = { 0 }; 
} 

這不允許跳過成員或重新排序,如果你這樣做只是拋出一個錯誤,但有100多個元件的結構,這將成爲非常寶貴的。

+2

當編譯C代碼時,GCC現在還支持C99命名的初始化程序,它可以讓你跳過並重新排序成員:struct canmsg_t msg = {.flags = 0x00; .length = 1; .id = 0x534; };' – caf 2010-02-01 09:23:01

+0

很高興知道Mike將*移植到*,因爲它可能不支持C99(例如MSVC++)。 – Clifford 2010-02-01 10:55:42