我最近將一個項目從GCC移植到了clang(我在其中修正了一些C GNU-isms)。這讓我想到:C GNU-isms(GCC中支持的C語言的擴展,哪些不是標準化的)存在?有沒有全面的清單?C GNU-isms存在什麼?
回答
這是一個非常全面的列表直接從GCC的網站。似乎有相當多的,所以我祝你好運篩選!
http://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/C-Extensions.html
雖然有很多的擴展,我推遲到測試版的答案是,這是不可能的項目依賴於很多人。可以在GNU構建中禁用擴展,因此只需執行該操作,就可以提前警告代碼庫中的任何潛在不兼容問題。
您可能會遇到其他問題,例如GCC支持大多數C99功能,而一些流行的編譯器不支持(Microsoft VC++專門)。因此,當您測試代碼庫時,您可能也想要禁用C99功能。
實際上,在Windows以外的(非嵌入式)系統上,大多數編譯器都是這樣做的支持大部分C99功能。這是comp.std.c新聞組當前存在爭議的主題,因此您也可以參閱groups.google.com。 – 2010-01-30 19:29:32
@Jonathan:這可能是因爲在非Windows系統(如OSX和Linux)上,事實上的標準編譯器*是* GCC。我實際上是一個嵌入式系統開發人員,並且支持許多C99功能(特別是像新頭文件這樣的免費功能)並不罕見。事實上,由於GCC在嵌入式系統中也很普遍,所以這很常見。 – Clifford 2010-01-31 09:27:04
即使是非GCC編譯器也支持大多數服務器級系統上的大部分C99(小心避免嵌入式空間,規則可能不同,並且我不能很好地洞察當前的實用性),而且25+這些年來的經驗基本上沒有幫助)。 – 2010-01-31 18:46:56
我發現的最好的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多個元件的結構,這將成爲非常寶貴的。
- 1. 什麼是指針存儲在c
- 2. C#4.0:爲什麼MethodBag存在ExpandoObject?
- 3. 什麼在C
- 4. 爲什麼在C++
- 5. 是什麼:: *在C++
- 6. 是什麼在C#
- 7. 什麼是在C#
- 8. C在做什麼?
- 9. 什麼是**在C++
- 10. 是什麼在C#
- 11. 爲什麼在C#
- 12. 什麼是&&在C++
- 13. 什麼是在C++
- 14. 是什麼在C#
- 15. 什麼?在C#中是什麼意思?
- 16. C - free()對內存有什麼作用?
- 17. 爲什麼會有內存泄漏? (C)
- 18. 什麼動態內存用於?(C++)
- 19. c-extension Python內存泄漏,爲什麼?
- 20. C++緩存文件是什麼意思?
- 21. c pthreads + valgrind =內存泄漏:爲什麼?
- 22. 爲什麼int存在於C中,爲什麼不只是短和長
- 23. 爲什麼Objective-C對象在交易後仍然存在?
- 24. 在單片機上的C#Resource.id劑量不存在爲什麼?
- 25. 在統一的C#腳本爲什麼輸入不存在?
- 26. 什麼數據將被存儲在堆棧中在C#
- 27. 爲什麼在C#中不存在枚舉擴展?
- 28. 這是什麼(C/C++)程序在做什麼?
- 29. Mono爲什麼存在?
- 30. 爲什麼Console.Out.WriteLine存在?
我看到你拒絕建議RTFM ;-) – Clifford 2010-01-30 09:27:56
值得注意的是,許多這些擴展實際上是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