gcc和clang中的__STDC_LIB_EXT1__可用性

问题描述 投票:6回答:1

由于快速谷歌搜索没有找到任何东西,我会试着在这里问(因为很多人参与gcc / clang在这里闲逛) - __STDC_LIB_EXT1__在gcc / clang中的地位是什么?我们正在开发一个跨平台应用程序,我想使用<stdio.h>中的一些安全边界检查函数(可以在Visual Studio 2017上使用miracle),但无法使用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"
^~~~~

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

c gcc clang c11 tr24731
1个回答
8
投票

使用_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库不会也不会支持它们)。

© www.soinside.com 2019 - 2024. All rights reserved.