C99功能被认为是有害的或不受支持的

时间:2009-12-14 04:17:51

标签: c compiler-construction c99 c89

我通常在C89中编写C代码,现在C99的某些功能(如intxx_t__VA_ARGS__snprintf)非常有用,甚至可能至关重要。

在我从C89到C99的更多要求之前,我想知道哪些C99功能得到了广泛支持,哪些功能得不到广泛支持甚至被认为是有害的。

我知道我们可以检查我们的目标编译器支持,但这会缩小我们的支持范围,因为这是开源软件,我更希望得到更广泛的支持。

例如,我们使用Solaris(suncc)编译器和gcc,但是我们可能会有其他编译器,我们可以在很少的努力下保持兼容性。

例如,我从未在Windows上工作,也不了解Windows编译器,但保持Windows兼容性会很好。

7 个答案:

答案 0 :(得分:9)

goto仍然是considered harmful


不知何故,我收集了四张羽绒投票。我提出上面的陈述是为了增加轻率,并且对它背后的概念只有30%认真。

我预计下来的选票来自那些不了解编程语言历史的年轻人。不是每一个 goto都是邪恶的,但是 - 与我曾经研究过的100%纯粹的意大利面条代码(数百万行FORTRAN 66)相比 - 替换尽可能多的代码是合理且高效的{ {1}}语句包含结构化语句(gotoforwhiledo .. while)。但有时一个switch在避免复杂性时就​​好了,例如额外的标志变量可以打破多个嵌套循环。

答案 1 :(得分:5)

好吧,无论您要针对哪种桌面操作系统,gcc基本上都是gcc。

Visual C ++,主要是一个C ++编译器,并不像C99规范那么关注。 stdint.h确实声明了你最喜欢的intxx_t宏。 __VA_ARGS__可用。 _Bool,_Complex和_Pragma未在Microsoft Visual C ++编译器上实现。我很确定%printal / scanf中的字段尚未实现,但VC2010可能会处理它们。 snprintf存在,但具有前导下划线和稍微不同的语义。

简短回答:“更容易”的C99功能是在不改变编译器语法或重新配置标准库的情况下实现,VC ++更有可能支持它。如果C99和C ++之间存在冲突,那么期望C ++获胜。

答案 2 :(得分:4)

许多C99功能是可选的,因此它们的缺乏在技术上不符合要求。我不会在下面区分。

  • 嗯,胜利没有<stdint.h>,虽然有an open-source version of stdint.h for Microsoft。即使实现了文件,也会丢失许多单独的类型。

  • 复杂和想象的支持经常被遗漏或破坏。

  • 扩展标识符和宽字符可以是问题点。

请参阅this list of C99 feature issues in gcc.

答案 3 :(得分:3)

运行时sizeof是编译器编写者的噩梦。所以我认为是有害的。

答案 4 :(得分:3)

glibc没有实现符合C99的realloc,因此realloc(ptr, 0)不可移植。

http://sourceware.org/bugzilla/show_bug.cgi?id=12547

答案 5 :(得分:2)

restrict成为C99中的关键字。这是实现侵占用户名称空间的实现。如果您有一个包含单词restrict的有效C89程序,则必须更改程序以使其适用于C99。换句话说:没有向后兼容性。如果他们要破坏向后兼容性,他们应该首先从标准中删除gets

答案 6 :(得分:0)

来自<tgmath.h>的类型泛型数学函数未必广泛实现,尽管它们似乎在MacOS X 10.6.2上提供了GCC 4.2.1。