Rud*_*lis 6 c gcc clang tr24731 c11
由于快速的Google搜索未找到任何内容,因此我将尝试在此处询问(由于涉及gcc / clang的许多人都在这里闲逛)__STDC_LIB_EXT1__-gcc / clang 的状态是什么?我们正在开发一个跨平台应用程序,我想使用其中的一些安全范围检查功能<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;
}
Run Code Online (Sandbox Code Playgroud)
但是编译失败,未定义宏:
gcc -std=c11 test.c
test.c:5:2: error: #error "__STDC_LIB_EXT1__ not defined"
#error "__STDC_LIB_EXT1__ not defined"
^~~~~
Run Code Online (Sandbox Code Playgroud)
我是在做错什么,还是对此功能集的支持很差?
带有_s后缀的整套“安全”功能支持不佳。Microsoft编写了带有_s后缀的一组函数,并将其提交给C标准委员会以进行标准化。该委员会进行了一些更改(可以说是出于必要),并创建了技术报告TR 24731-1。C11标准ISO / IEC 9899:2011中将TR的轻度修改版本作为可选的附件K(规范性)包括在内。
您可以在答案中找到许多肮脏的细节。是否使用TR-24731的“更安全”功能?,尤其是在我对该问题的回答中的注释中,尤其是与标准C委员会文件N1967的“具有附件K —边界检查接口”的现场经验的链接。
我不知道N1967提案的当前状态是什么,但有人建议说这可以说明问题。N1967还包含指向支持附件K / TR-24731-1的库的链接-列表是有限的。
请注意,Microsoft没有实现C11标准指定的库。它实现了对标准的近似,但是存在关键差异。如果任何其他系统已经实现了该标准,那就更重要了-但是这些功能还没有以任何公认的形式实现(例如,GNU C库不会也不支持它们)。