由于快速谷歌搜索没有找到任何东西,我会尝试在这里询问(因为很多参与 gcc/clang 的人都在这里闲逛) - 的状态是什么__STDC_LIB_EXT1__
在海湾合作委员会/铿锵?我们正在开发一个跨平台应用程序,我想使用一些安全边界检查功能<stdio.h>
(奇迹般地可以在 Visual Studio 2017 上使用),但无法使用 Xcode 9.2 编译代码。我认为 Xcode 使用的 clang 版本可能已经过时,但 Ubuntu 上的 gcc 6.3.0 的行为是相同的。我正在尝试使用tmpnam_s http://en.cppreference.com/w/c/io/tmpnam具有以下示例:
#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"
^~~~~
是我做错了什么还是这个功能集支持很差?
整套“安全”功能_s
后缀支持很差。微软编写了一组函数_s
后缀并将其提交给 C 标准委员会进行标准化。该委员会进行了一些更改(可以说是出于必要),并创建了一份技术报告 TR 24731-1。 TR 的轻微修改版本作为可选附录 K(规范性)包含在 C11 标准 ISO/IEC 9899:2011 中。
你可以在答案中找到许多肮脏的细节您使用TR-24731“更安全”的功能吗? https://stackoverflow.com/q/372980/15168,尤其是在我的笔记中answer https://stackoverflow.com/a/373911/15168对于这个问题,尤其是标准 C 委员会文件的链接N1967 附件 K 的现场经验 — 边界检查接口 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm.
我不知道 N1967 提案的现状如何,但它的建议很能说明问题。 N1967 还包含支持附件 K / TR-24731-1 的库的链接 - 列表有限。
请注意,Microsoft 并未实现 C11 标准指定的库。它实现了与标准的近似值,但存在重大差异。如果任何其他系统已经实现了该标准,那么这一点就更重要了——但这些功能尚未以任何广泛接受的形式实现(因此,例如,GNU C 库不支持也不会支持它们)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)