[英]Compilation error while including header file in compile command
我有兩個文件main.c
和header.c
。
main.c
有一些宏STR
,我想根據文件中的一些#define
有條件地定義它們的值。
案例一:
當我在main.c
文件中包含header.c
時,程序運行正常,如下所示:
主文件
#include<stdio.h>
#define _flag_b
#include "header.c"
void main(){
printf("%s", STR);
}
頭文件
#ifndef _flag_a
#define STR "flag a is activated.\n"
#endif
#ifndef _flag_b
#define STR "flag b is activated.\n"
#endif
匯編
anupam@g3:~/Desktop/OS 2020/so$ gcc main.c
anupam@g3:~/Desktop/OS 2020/so$ ./a.out
flag a is activated.
案例2 :
但出於某種原因,我想在編譯命令中包含header.c
而不是在main.c
。 這為我創造了這個問題,如下所示:
主文件
#include<stdio.h>
#define _flag_b
// #include "header.c"
void main(){
printf("%s", STR);
}
頭文件
#ifndef _flag_a
#define STR "flag a is activated.\n"
#endif
#ifndef _flag_b
#define STR "flag b is activated.\n"
#endif
匯編
anupam@g3:~/Desktop/OS 2020/so$ gcc main.c header.c
main.c: In function ‘main’:
main.c:7:15: error: ‘STR’ undeclared (first use in this function)
7 | printf("%s", STR);
| ^~~
main.c:7:15: note: each undeclared identifier is reported only once for each function it appears in
header.c:6: warning: "STR" redefined
6 | #define STR "flag b is activated.\n"
|
header.c:2: note: this is the location of the previous definition
2 | #define STR "flag a is activated.\n"
|
我對這個問題做了很多研究,並且能夠理解為什么會出現這個問題。 但我無法解決這個問題。
請幫助我更好地理解這個問題,並為此提出一些解決方案。 也幫助我重新表述這個問題。
#define 為預處理器定義了一個宏 - 這意味着在編譯之前,已定義宏的每個實例(在其定義之后)都被替換,在您的情況下,在 #define STR 之后......每個 STR 實例都被替換為指定的常量。 更多關於這里的宏
#include 只是復制一個文件並將其粘貼到指定的位置。 更多關於標題在這里
第一個示例有效,因為您包含了標頭和代碼,如下所示:
/*
stuff included by stdio.h
*/
int main(void) {
printf("%s", "flag a is activated.\n");
}
它可以輕松編譯。 但是在第二個示例中,您嘗試分別編譯每個文件,因此第一個文件如下所示:
/*
stuff included by stdio.h
*/
int main(void) {
printf("%s", STR); //preprocessor doesn't recognise STR as a macro
}
第二個文件是空的。 所以現在編譯器試圖編譯它,但它不知道 STR 是什么,所以你有一個錯誤。
如果要將其保留為 #define,則需要包含標題。
您可以在此處閱讀有關預處理的更多信息。 如果要查看預處理器的輸出,則需要使用 -E 標志,例如:gcc main.c -E -o mainPreprocessed.c
請下次將代碼作為文本而不是圖像包含 - 人們會更容易回答。
還有一件事:*.c 文件用於代碼(您在 g++ 命令中添加),*.h 文件用於標頭(您用 #include 包含)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.