什么C99功能被认为有害或不支持的[封闭]
-
19-09-2019 - |
题
我通常会写C码在C89,现在的一些特点C99(喜欢 intxx_t
或 __VA_ARGS__
或 snprintf
)是非常有用的,甚至可以至关重要的。
之前我更多我要求从C89到C99我想知道它的C99功能的广泛支持,而哪些被没有得到广泛的支持,甚至被认为是有害的。
我知道我们可能只是检查我们的目标编译器支撑,但是这将缩小我们支持很多,因为这是对开放源码软件,我会更喜欢有一个更广泛的支持。
例如,我们使用Solaris(suncc)编译器和海湾合作委员会,但可能还有其他编译器,我们就会搬出去的方式,同时我们可以保持兼容性,有非常小的努力。
例如,我从来不曾在Windows我也不知道任何有关Windows编译器,但这将是很好的保持Windows的兼容性。
解决方案
一些C99的特点是可选择的,所以他们缺乏的不是技术上不符.我不会区分如下。
嗯,赢得没有
<stdint.h>
, 虽然没有 开放源代码版本的stdint.h用于Microsoft.即使在该文件是实现的,许多个别种类缺失。复杂的和虚构的支助往往是缺失或损坏。
扩展的标识和广泛的人物可以问点。
其他提示
goto
仍然认为有害。
不知何故,我已收集的 4 向下票。我提出上面的语句添加轻率,并且是只有30%的认真态度背后的概念。
我期待下投票是从年轻人谁不明白的编程语言的历史。不每一个 goto
恶,只要-与100%相比未掺杂面条代码我已在(百万FORTRAN 66的行) - 它是合理的生产性来替换具有结构化语句许多goto
语句工作(for
,while
,do .. while
,switch
)越好。但有时goto
只是罚款时,它避免了复杂性,如额外的标志变量来打破多重嵌套的循环。
好了,GCC基本上会不管你的目标,其桌面操作系统的被gcc的。
视觉C ++,的主要是C ++编译器,是不是很关心C99规格。 stdint.h不声明自己喜欢的intxx_t宏。 __VA_ARGS__
可用。 _Bool,_Complex和_Pragma不会对微软的Visual C ++编译器实现的。我敢肯定%在printf中/ scanf的一个领域都没有得到落实,虽然也许VC2010处理它们。的snprintf存在,但有一个前导下划线和稍有不同的语义。
短的答案:在“更容易”一个C99的特征是不改变编译的语法或更换水管的标准库来实现,就越有可能VC ++是支持它。如果有++ C99和C之间的冲突,希望C ++取胜。
运行的sizeof是编译器的作家的梦魇。所以,我认为是有害的。
glibc不实现C99-符合realloc
,所以realloc(ptr, 0)
是不可移植的。
restrict
成为C99关键字。这是对用户的命名空间中实现攻城掠地。如果您有包含单词restrict
有效的C89程序,你必须改变你的程序,使之与C99工作。换句话说:没有向后兼容性。如果他们要打破向后兼容性,它们应该具有除去gets
从标准第一
这<tgmath.h>
类型通用的数学函数不一定广泛实施,但它们似乎是在MacOS X 10.6.2设有GCC 4.2.1。