簡體   English   中英

我正在使用 Linux,用 gcc 編譯,收到錯誤:警告:函數 'fopen_s' 的隱式聲明,有人可以幫我解決這個問題嗎?

[英]I'm using Linux, compiling with gcc, getting error: warning: implicit declaration of function ‘fopen_s’, can someone help me fix this?

我正在嘗試用 c 編寫一個簡單的邊緣檢測程序。 我使用的是 Red Hat Enterprise Linux Server 7.7 (Maipo) 和 gcc 版本 4.8.5。

這是代碼的開頭:

#include <stdio.h>

#define size 200

int _tmain(int argc, _TCHAR* argv[])
{
    char filein[size] = "./image.bmp";

    FILE *fin;

    fopen_s(&fin, filein, "rb");

return 0;

}

我最初使用 _TCHAR* 時遇到了很多問題,所以最終我只用 char 替換了它,我不知道以后是否會出現問題,但至少它編譯並消除了這些錯誤。 現在我收到了隱式聲明警告。 我試圖通過添加其他#include 來修復它。

我試圖用以下方法修復它:

#include <stdio.h>
#include <errno.h>
#include <string.h>

#define size 200

int main(int argc, char* argv[])
{
    char filein[size] = "./image.bmp";

    FILE *fin;

    fopen_s(&fin, filein, "rb");

return 0;

}

但是,我仍然收到同樣的警告,有人能告訴我我做錯了什么嗎?

謝謝。

非常感謝,這有效!

#include <stdio.h>

#define size 200

int main(int argc, char* argv[])
{

    char filein[size] = "./image.bmp";

    FILE *fin;

    fin = fopen(filein, "rb");

return 0;

}

_s系列函數是 C 標准附錄 K 中的可選函數,很少有任何 C 實現費心去實現附錄 K。附錄 K 中引入的“安全”函數的實際效用存在很大爭議; 只需放棄這些功能並使用標准功能,例如fopen

我唯一一次遇到_s函數是在為 Windows 編寫的代碼中,Microsoft 包含了這些函數的自己版本,但不符合附件 K 中規定的標准。

有關檢查附件 K 效用的研究,請參見此處: http : //www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm

他們的結論:

盡管自最初的提案以來已有十多年的時間,並且自 ISO/IEC TR 24731-1:2007 批准以來已近十年,並且自將邊界檢查接口引入 C 標准以來已近五年,但沒有出現可行的符合性實現. API 繼續存在爭議,實施者繼續拒絕實施請求。

邊界檢查接口的設計雖然是善意的,但有太多的問題需要糾正。 與依賴既定方法或現代技術相比,使用 API 已被視為導致質量更差、安全性更低的軟件。 更有效和更少侵入性的方法已變得司空見慣,並且通常受到用戶和安全專家等人的青睞。

因此,我們建議附件 K 要么從 C 標准的下一個修訂版中刪除,要么棄用然后刪除。

fopen_s僅在 C11 的可選邊界檢查庫中可用。 為了使用它,您需要執行以下操作:

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <errno.h>
... // rest of program

然后用-std=c11編譯並祈禱。

因為邊界檢查庫的編譯器支持很差,我不確定 gcc 實際實現了多少。 C 程序員之間的普遍共識似乎是邊界檢查庫是危險的,應該避免 - 它的發布是一場徹底的失敗。

你最好忘記所有關於這個庫並使用fopen代替。

暫無
暫無

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

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