簡體   English   中英

在編譯命令中包含頭文件時出現編譯錯誤

[英]Compilation error while including header file in compile command

我有兩個文件main.cheader.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.

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