簡體   English   中英

__STDC_LIB_EXT1__ 在 gcc 和 clang 中的可用性

[英]__STDC_LIB_EXT1__ availability in gcc and clang

由於快速谷歌搜索沒有找到任何東西,我會在這里嘗試詢問(因為很多參與 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"
^~~~~

我做錯了什么還是這個功能集的支持很差?

對帶有_s<\/code>后綴的整套“安全”函數的支持很差。 Microsoft 編寫了一組帶有_s<\/code>后綴的函數,並將其提交給 C 標准委員會進行標准化。 委員會進行了一些更改(可以說是出於必要),並創建了一份技術報告 TR 24731-1。 在 C11 標准 ISO\/IEC 9899:2011 中,TR 的輕微修改版本作為可選附件 K(規范性)包含在內。

您可以在您使用 TR-24731“更安全”功能<\/a>的答案中找到許多骯臟的細節嗎?<\/a> ,特別是在我對該問題的回答<\/a>中的注釋中,尤其是標准 C 委員會文件N1967 Field Experience with Annex K - Bounds Checking Interfaces 的鏈接<\/a>。

我不知道 N1967 提案的當前狀態是什么,但它的建議很能說明問題。 N1967 還包含指向支持附件 K \/ TR-24731-1 的庫的鏈接——列表有限。

請注意,Microsoft 沒有實現 C11 標准指定的庫。 它實現了標准的近似值,但存在關鍵差異。 如果任何其他系統實現了該標准,這將更重要——但這些功能還沒有以任何被廣泛接受的形式實現(因此,例如,GNU C 庫不支持它們,也不會支持它們)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM