我想列印 txt 檔案的內容(第一個引數),但執行此操作的函式位于不同的檔案中。我有以下主檔案:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fileoperation.h"
int main(int argc, char **argv)
{
read(argv[1]);
return 0;
}
然后在 fileoperation.c 檔案中我有:
#include "fileoperation.h"
void read(char* file)
{
FILE *fptr;
char c;
fptr = fopen(file, "r");
if (fptr == NULL)
{
printf("Cannot open file \n");
exit(0);
}
c = fgetc(fptr);
while (c != EOF)
{
printf ("%c", c);
c = fgetc(fptr);
}
fclose(fptr);
}
如果我在主函式中鍵入函式中的代碼,它就可以作業。我不明白為什么不起作用
fileoperation.c 的頭檔案是
#ifndef FILEOPERATION_H
#define FILEOPERATION_H
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void read(char* file);
#endif
uj5u.com熱心網友回復:
重命名您的函式。read存在于支持庫中。更糟糕的是,編譯器知道它做什么并優化它。
本來可以更糟。您可以read用自己的替換實際并炸毀標準庫。
uj5u.com熱心網友回復:
您似乎使用的是非標準編譯器,或者您的配置不正確。眾所周知,gcc 和 clang 等編譯器會呼叫不合規的行為,除非您使用它進行編譯-std=c17 -pedantic-errors(請參閱為初學者學習 C 推薦哪些編譯器選項?)。我無法使用 C 兼容編譯器重現該問題。
柔順編譯器不容許放置非標準識別符號在比那些由C標準明確地保留其他標準頭。保留識別符號的例子是那些帶有兩個前導下劃線的識別符號,那些帶有前導下劃線后跟一個大寫字母的識別符號以及為將來的語言/庫擴展保留的識別符號。來源:ISO 9899:2018 第 4/6、7.1.3、6.11 和 7.31 章。
如上所述,在 C 語言兼容模式下編譯時,上述編譯器應洗掉所有非標準識別符號宣告。如果沒有,則您發現了編譯器庫錯誤。
存在一個古老的、眾所周知的(而且名稱非常糟糕)函式read,但它從未成為標準 C 庫的一部分。(POSIX 試圖對其進行標準化,但這在這里無關緊要。)所以簡單的解決方案是不命名識別符號read- 不是因為眾所周知的非標準函式具有該名稱,而是因為它非常糟糕且非-描述性識別符號名稱。在你的情況下,你可以使用read_file或類似的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338876.html
上一篇:VSCode中的比較警告
