有人知道不依赖gcc的C编译器吗?

有人知道不依赖gcc的C编译器吗?,c,gcc,portability,C,Gcc,Portability,我正在尝试查看我的代码是否可以在除GCC之外的许多编译器中移植,并且绝对不是接受GNUC方言的编译器,因为我使用了很多扩展和属性。 对于属性,我使用了操作符\u has\u attribute来检查属性的功能是否实现,但是对于扩展,这并不容易。 所以我需要对程序的可移植性做一些测试,看看我应该修改什么。 有人知道不依赖gcc的编译器吗?有一些编译器不是基于gcc的,比如clang或MSVC,但我认为您没有从最佳角度来解决这个问题 有一个标准明确规定了语言中包含哪些功能(即我们称之为可移植的功能)

我正在尝试查看我的代码是否可以在除GCC之外的许多编译器中移植,并且绝对不是接受GNUC方言的编译器,因为我使用了很多扩展和属性。 对于属性,我使用了操作符
\u has\u attribute
来检查属性的功能是否实现,但是对于扩展,这并不容易。 所以我需要对程序的可移植性做一些测试,看看我应该修改什么。
有人知道不依赖gcc的编译器吗?

有一些编译器不是基于gcc的,比如clang或MSVC,但我认为您没有从最佳角度来解决这个问题

有一个标准明确规定了语言中包含哪些功能(即我们称之为可移植的功能),还有一些编译器文档介绍了哪些功能是语言的扩展。您应该通过阅读可用的文档来解决此问题,并了解这些功能是否可移植。如果不是,其他编译器实现它们的常见程度如何

一个这样的编译器是。这实际上提供了一些非常好的工具,特别是对于多线程进程分析


您还可以使用GCC的
-std
-Wpedantic
-pedantic errors
选项检查不可移植代码。看见例如,
gcc-std=c11-Wpedantic-pedantic errors…
应该只允许严格兼容的c11代码在没有警告或错误的情况下通过。您还可以添加
Werror
,以在任何警告中导致错误。

一个关键领域是,在C规范中定义了实现,越来越多的错误代码依赖于GCC的实现,这些实现不可移植,并且无法通过_has_属性找到。尤其是位字段、结构和联合。不要期望在编译器文档中找到它们(除了源代码),要阅读他们声称符合的语言规范,然后做实验。是的,还有其他编译器,应该很容易找到它们。诚然,许多人开始只是修改gcc的变体或包装,这使问题变得更糟。还请注意,纯粹主义者会说唯一的C标准是当前的C标准。并非所有的工具链都会在每次发布标准时重新使用工具。根据您的目标是什么,您可能永远看不到针对该目标的最新标准编译器,但可能仍然需要专业地使用此类工具。工具不会告诉您法规遵从性/可移植性。很多都来自经验,不要使用该语言的ghee-whiz特性(没有指令/pragmas是一个好的开始,或者根本不要使用结构/联合/位字段,或者正确使用它们,小心使用指针等)。工具建议不在这里讨论。几乎所有不是gcc的编译器都符合要求。对于x86,clang和icc是最有名的。还有Embarcadero和Visual Studio,尽管后者不遵循标准C。甚至可能
-Wpedantic错误…
@pmg已添加。谢谢。suncc(Oracle Developer Studio)现在支持许多gcc扩展。@Marglisse我知道。不过,我不确定它是如何变成的,所以我把它省略了。@pmg gcc似乎还有一个
-Werror=pedantic
选项。上面提到过,但没有另外解释。不过,这似乎是对Werror的限制。我可能无法正确使用这些词来解决问题,因为我不是以英语为母语的人。但感谢你们的提示,我学到了一些新的英语单词,通过其他编译器/版本测试可移植性确实有助于消除C规范解释的差异。像
\u Generic
这样的新特性通常是抱怨,或者几乎是抱怨,但是规范允许为不同的功能提供足够的回旋空间(缺乏特殊性)。