C 什么是GNU主义?

C 什么是GNU主义?,c,gcc,language-extension,C,Gcc,Language Extension,我最近将一个项目从GCC移植到了clang(在这个项目中,我修复了许多C GNU ISM)。这让我思考:存在什么样的C GNU ISM(GCC支持的C语言的扩展,没有标准化)?任何地方都有一个全面的列表吗?这是一个非常全面的列表,直接从GCC的网站上获得。这里似乎有很多,所以我祝你在筛选过程中好运 尽管有许多扩展,我还是遵从Beta的答案,但您的项目不太可能依赖其中的许多扩展。在GNU构建中禁用扩展是可能的,因此只要这样做,就可以提前警告代码库中的任何潜在不兼容 您可能会遇到其他问题,例如GCC

我最近将一个项目从GCC移植到了clang(在这个项目中,我修复了许多C GNU ISM)。这让我思考:存在什么样的C GNU ISM(GCC支持的C语言的扩展,没有标准化)?任何地方都有一个全面的列表吗?

这是一个非常全面的列表,直接从GCC的网站上获得。这里似乎有很多,所以我祝你在筛选过程中好运


尽管有许多扩展,我还是遵从Beta的答案,但您的项目不太可能依赖其中的许多扩展。在GNU构建中禁用扩展是可能的,因此只要这样做,就可以提前警告代码库中的任何潜在不兼容


您可能会遇到其他问题,例如GCC支持大多数C99功能,而一些流行的编译器不支持(特别是Microsoft VC++)。因此,在测试代码库时,您可能也希望禁用C99功能。

我发现的最好的GNUI之一是在填充结构时的显式键声明

 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+元素结构,这变得非常宝贵。

我看到您拒绝建议RTFM;-)值得注意的是,其中许多扩展实际上是C99的一部分。它们是GCC中唯一的GNU扩展,GCC允许您在C89模式下使用它们。e、 g:实际上,在Windows以外的(非嵌入式)系统上,大多数编译器都支持C99的大部分功能。这是目前comp.std.c新闻组争论的话题,所以你也可以在groups.google.com上查找信息。@乔纳森:这可能是因为在OSX和Linux等非Windows系统上,事实上的标准编译器是GCC。事实上,我是一名嵌入式系统开发人员,支持许多C99功能(特别是像新标题这样的免费功能)并不少见。事实上,由于GCC在嵌入式系统中也很普遍,所以它非常常见。即使是非GCC编译器也支持大多数服务器类系统上的大部分C99(小心避开嵌入式空间,因为这里的规则可能不同,而且我对当前的实际情况没有很好的了解,而25年以上的经验现在基本上没有帮助).你的观点很好,我也没有异议。但是开发人员应该知道,如果他们使用C99,尽管许多编译器都会接受它,但它是Windows上最常用的一种(而Windows又是桌面上使用最广泛的操作系统)不会,因为这是一个从GCC移植到某个未指定编译器的问题,考虑因素可能是密切相关的。在承认未经声明的声明后,我将“many”改为“some”。但即使是一个,如果被许多人使用,也很重要。(当编译C代码时,GCC现在也支持C99命名的初始值设定项,允许您跳过和重新排序成员:
struct canmsg\u t msg={.flags=0x00;.length=1;.id=0x534;}如果知道Mike正在移植到什么,那就太好了,因为这可能也不支持C99(例如MSVC++)。