gpt4 book ai didi

c - __STDC_LIB_EXT1__ 在 gcc 和 clang 中的可用性

转载 作者:太空狗 更新时间:2023-10-29 17:21:06 27 4
gpt4 key购买 nike

由于快速谷歌搜索没有找到任何东西,我会试着在这里问(因为有很多人参与 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;
}

但是编译失败,没有定义宏:

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

是我做错了什么,还是这个功能集的支持很差?

最佳答案

带有 _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 还包含指向支持 Annex K/TR-24731-1 的库的链接——列表是有限的。

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

关于c - __STDC_LIB_EXT1__ 在 gcc 和 clang 中的可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47867130/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com