我通常在C89中编写C代码,现在C99的某些功能(如intxx_t
或__VA_ARGS__
或snprintf
)非常有用,甚至可能至关重要。
在我从C89到C99的更多要求之前,我想知道哪些C99功能得到了广泛支持,哪些功能得不到广泛支持甚至被认为是有害的。
我知道我们可以检查我们的目标编译器支持,但这会缩小我们的支持范围,因为这是开源软件,我更希望得到更广泛的支持。
例如,我们使用Solaris(suncc)编译器和gcc,但是我们可能会有其他编译器,我们可以在很少的努力下保持兼容性。
例如,我从未在Windows上工作,也不了解Windows编译器,但保持Windows兼容性会很好。
答案 0 :(得分:9)
goto
仍然是considered harmful。
不知何故,我收集了四张羽绒投票。我提出上面的陈述是为了增加轻率,并且对它背后的概念只有30%认真。
我预计下来的选票来自那些不了解编程语言历史的年轻人。不是每一个 goto
都是邪恶的,但是 - 与我曾经研究过的100%纯粹的意大利面条代码(数百万行FORTRAN 66)相比 - 替换尽可能多的代码是合理且高效的{ {1}}语句包含结构化语句(goto
,for
,while
,do .. 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。即使实现了文件,也会丢失许多单独的类型。
复杂和想象的支持经常被遗漏或破坏。
扩展标识符和宽字符可以是问题点。
答案 3 :(得分:3)
运行时sizeof是编译器编写者的噩梦。所以我认为是有害的。
答案 4 :(得分:3)
glibc没有实现符合C99的realloc
,因此realloc(ptr, 0)
不可移植。
答案 5 :(得分:2)
restrict
成为C99中的关键字。这是实现侵占用户名称空间的实现。如果您有一个包含单词restrict
的有效C89程序,则必须更改程序以使其适用于C99。换句话说:没有向后兼容性。如果他们要破坏向后兼容性,他们应该首先从标准中删除gets
。
答案 6 :(得分:0)
来自<tgmath.h>
的类型泛型数学函数未必广泛实现,尽管它们似乎在MacOS X 10.6.2上提供了GCC 4.2.1。