符合ANSI C的实现是否可以在其标准库中包含其他功能?

Bra*_*sen 9 c standards ansi getline osx-lion

是否符合ANSI C标准的实现允许在其标准库中包含其他类型和函数,超出标准列举的那些类型和函数?(理想的答案将参考ANSI标准的相关部分.)

我特别要求,因为Mac OS 10.7 getline在stdio.h中声明了该函数,即使使用该-ansi标志使用gcc或clang进行编译也是如此.这打破了几个定义自己getline功能的旧程序.这是Mac OS 10.7的错吗?(getlineMac OS 10.7上的手册页说明getline符合2008年发布的POSIX.1标准.)

编辑:为了澄清,我发现奇怪的是,在Mac OS 10.7上的ANSI C89程序中包含stdio.h也会引入该getline函数的声明,因为getline它不是K&R(可能是ANSI)中所列举的函数之一. stdio.h中.特别是,尝试编译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
Run Code Online (Sandbox Code Playgroud)

它是否是Mac OS 10.7中的一个错误,getline即使在编译ANSI C89标准时也包括stdio.h中的声明?

Die*_*Epp 12

从n1570第7.1.3节(这是C1x的草案):

没有保留其他标识符.

这个部分意味着getline不应该被定义<stdio.h>,因为根据规范,它不是保留的标识符.因此,如果您的库定义getline<stdio.h>,它在技术上不符合C标准......

但是,您应该能够使用功能测试宏来导致getline未定义<stdio.h>.

#undef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 200112L
#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)

这将只提供旧POSIX标准的定义.这对某些GNU C++实现不起作用,对于某些人来说这是非常好的结果.

该联机帮助页的相关部分(摘自glibc联机帮助页,抱歉......)

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       getline(), getdelim():
           Since glibc 2.10:
               _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
           Before glibc 2.10:
               _GNU_SOURCE

该联机帮助页的这一部分告诉您需要将哪些宏定义到哪些值才能获得定义.我敢打赌,_POSIX_C_SOURCE你的编译器已经定义了200809L.

功能测试宏的想法是,如果你定义宏,如_POSIX_C_SOURCE,_BSD_SOURCE,_XOPEN_SOURCE,等你想要的值,你就不必担心新的库函数与您现有的功能发生冲突.还有_GNU_SOURCE,如果你使用glibc ,它会打开所有东西,但我建议给那个宏一个广泛的位置.