gcc和clang中的__STDC_LIB_EXT1__可用性

时间:2017-12-18 11:05:11

标签: c gcc clang c11 tr24731

由于快速Google搜索没有找到任何内容,我会在这里问一下(因为很多参与gcc / clang的人都在这里闲逛) - gcc / clang中__STDC_LIB_EXT1__的状态是什么?我们正在开发一个跨平台应用程序,我想使用<stdio.h>中的一些安全边界检查函数(在Visual Studio 2017上可以使用奇迹),但是无法使用Xcode 9.2编译代码。我想也许Xcode使用的clang版本已经过时,但Ubuntu上的gcc 6.3.0表现相同。我正在尝试使用tmpnam_s以下示例:

#if defined(__STDC_LIB_EXT1__)
#define  __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#else
#error "__STDC_LIB_EXT1__ not defined"
#endif

int main(int argc, char** argv)
{
    char t[L_tmpnam_s]; 
    tmpnam_s(t, L_tmpnam_s);
    return 0;
}

但编译失败,未定义宏:

gcc -std=c11 test.c
test.c:5:2: error: #error "__STDC_LIB_EXT1__ not defined"
#error "__STDC_LIB_EXT1__ not defined"
^~~~~

我做错了什么或者这个功能集得到的支持很差?

1 个答案:

答案 0 :(得分:7)

支持_s后缀的整套“安全”功能。 Microsoft编写了一组带有_s后缀的函数,并将其提交给C标准委员会进行标准化。委员会做了一些改变(可以说是必要的),并创建了一份技术报告,TR 24731-1。 TR的轻度修改版本作为可选附件K(规范性)包含在C11标准ISO / IEC 9899:2011中。

您可以在Do you use the TR-24731 "safer" functions?的答案中找到许多肮脏的详细信息,尤其是我answer对该问题的说明,尤其是标准C委员会文档N1967 Field Experience with Annex K — Bounds Checking Interfaces的链接。

我不知道N1967提案的当前状态是什么,但有人建议这样做。 N1967还包含支持附件K / TR-24731-1的库的链接 - 列表有限。

请注意,Microsoft未实现C11标准指定的库。它实现了对标准的近似,但存在重要的差异。如果任何其他系统已经实现了标准,这将更加重要 - 但功能尚未以任何广泛接受的形式实现(例如,GNU C库不会也不会支持它们。)