C99有哪些功能被认为是有害或不支持的?

18

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

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

我知道我们可以检查目标编译器的支持情况,但这会大大缩小我们的支持范围,而且由于这是针对开源软件的,我更希望获得更广泛的支持。

例如,我们使用Solaris(suncc)编译器和gcc,但可能会有其他编译器我们会避开,同时仍然保持与极少努力即可实现的兼容性。

例如,我从未在Windows上工作过,也不了解任何关于Windows编译器的知识,但保持与Windows的兼容性是一个好主意。


MinGW解决你的Windows问题。它基本上是Windows下的gcc - GManNickG
1
你想让你的软件支持嵌入式平台吗?针对嵌入式平台的交叉编译器不太可能支持C99。 - Craig McQueen
有关C99中最有用的新功能的相关问题,请参见https://dev59.com/1nI-5IYBdhLWcg3wBjnl。 - Brian Campbell
7个回答

8

goto仍被视为有害的


Somehow我已经收集了四个反对票。 我提出上述陈述是为了增添轻松气氛,并且只有30%的内容与其背后的概念相关。
我认为这些反对票来自不了解编程语言历史的年轻人。 不是每个单独的goto语句都是邪恶的,但与我曾经工作过的100%未经修改的意大利面代码(数百万行FORTRAN 66)相比,尽可能用结构化语句(for,while,do..while,switch)替换尽可能多的goto语句是合理和有效的。 但是,当避免复杂性时,有时使用goto语句很好,例如避免使用额外的标志变量来跳出多个嵌套循环。

3
哦,把一个放在每个程序里只是为了惹恼纯粹主义者,这很有趣。但是请把它指向下方而不是向上方。 - DigitalRoss
13
在使用C语言编写真实世界的程序时,Goto语句是必需的。 - Alexandre C.
16
不,goto在使用C语言编写真实世界程序时偶尔是有用的。 - AShelly

5

嗯,无论你的桌面操作系统是什么,gcc基本上都是gcc。

Visual C++主要是C++编译器,不太关心C99规范。stdint.h声明了您最喜欢的intxx_t宏。 __VA_ARGS__可用。在Microsoft Visual C++编译器上未实现_Bool、_Complex和_Pragma。我很确定printf/scanf中的%a字段尚未实现,尽管可能VC2010已经处理了它们。snprintf存在,但有一个前导下划线和略微不同的语义。

简短回答:如果在不改变编译器语法或重新排列标准库的情况下实现C99功能越容易,那么VC++支持的可能性就越大。如果C99和C++之间存在冲突,则预计C++会获胜。


4

C99的一些特性是可选的,因此它们的缺乏在技术上并不是不符合标准。以下我不会进行区分。

  • 嗯,Windows没有<stdint.h>,尽管有适用于Microsoft的开源版本stdint.h。即使文件已实现,许多单独的类型也会缺失。

  • 复数和虚数支持经常缺失或损坏。

  • 扩展标识符和宽字符可能成为问题点。

请参见gcc中C99功能问题列表。


3
Visual C++ 2010 包含 stdint.h。 - ChrisV
30
只晚了11年!叹气 - Stephen Canon

3

运行时 sizeof 是编译器编写者的噩梦。因此我认为它是有害的。


3

2

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


2
同样适用于 inline - R.. GitHub STOP HELPING ICE

0

<tgmath.h>中的泛型数学函数不一定被广泛实现,尽管它们似乎在MacOS X 10.6.2上的GCC 4.2.1中提供。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接