ANSI C兼容的实现是否允许在其标准库中包含超出标准列举的类型和函数?(理想的答案是引用ANSI标准的相关部分。)
我特别问,因为Mac OS 10.7在stdio. h中声明了getline
函数,即使在使用gcc或clang编译时使用-ansi
标志。这会破坏几个定义自己的getline
函数的旧程序。这是Mac OS 10.7的错误吗?(Mac OS 10.7上getline
的手册页上说getline
符合2008年发布的POSIX. 1标准。
编辑:为了澄清,我发现在Mac OS 10.7上的ANSI C89程序中包含stdio. h也会拉入getline
函数的声明,这很奇怪,因为getline
不是stdio. h的K&R(可能是ANSI)描述中枚举的函数之一。特别是,尝试编译noweb:
gcc -ansi -pedantic -c -o notangle.o notangle.c
In file included from notangle.nw:28:
getline.h:4: error: conflicting types for ‘getline’
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here
即使在为ANSI C89标准编译时,Mac OS 10.7中也会在stdio. h中包含getline
的声明,这是一个bug吗?
2条答案
按热度按时间2ekbmq321#
根据n1570第7.1.3节第2段(C1x草案):
不保留其他标识符。
这意味着
getline
不应该由<stdio.h>
定义,因为根据规范,它不是保留标识符。因此,如果您的库在<stdio.h>
中定义了getline
,则在技术上不符合C标准...但是,您应该能够使用特性测试宏来使
getline
在<stdio.h>
中未定义。这只会给予你旧的POSIX标准的定义。这在一些GNU C++实现上不起作用,对一些人来说这是ExTrEmeLY fruSTraTiNG。
手册页的相关部分是(取自一个glibc手册页,对不起……)
手册页的这一部分告诉你哪些宏需要被定义为哪些值才能得到定义。我敢打赌
_POSIX_C_SOURCE
已经被你的编译器定义为200809L
了。功能测试宏的想法是,如果你定义你的宏,像
_POSIX_C_SOURCE
,_BSD_SOURCE
,_XOPEN_SOURCE
等,你想要的值,你就不需要担心新的库函数与你现有的函数冲突。还有_GNU_SOURCE
,如果你使用glibc,它会打开 * 一切 *,但我建议给那个宏一个宽的距离。enxuqcxy2#
是的,允许兼容的实现定义额外的标识符,包括函数,只要它们是标准中的保留标识符之一。例如:
is
、to
、str
、mem
或wcs
开始并后跟小写字母的所有外部名称;此外,还有一些名称只有在包含某些标头时才保留;例如,如果你包含
<errno.h>
,那么它可以定义任何以E
开头,后跟一个数字或大写字母的宏。然而,
getline()
* 不是 * 这样的保留名称,并且兼容的实现必须使其可供程序员自己使用。