在编译命令中包含头文件时出现编译错误
Compilation error while including header file in compile command
我有两个文件 main.c
和 header.c
。
main.c
有一些宏 STR
我想根据文件中的某些 #define
有条件地定义其值。
案例一:
当我在 main.c
文件中包含 header.c
时,程序运行正常,如下所示:
main.c
#include<stdio.h>
#define _flag_b
#include "header.c"
void main(){
printf("%s", STR);
}
header.c
#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.
案例二:
但出于某种原因,我想在编译命令中包含 header.c
而不是在 main.c
中。如下所示,这为我造成了这个问题:
main.c
#include<stdio.h>
#define _flag_b
// #include "header.c"
void main(){
printf("%s", STR);
}
header.c
#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 的每个实例都被替换为指定常数。有关宏的更多信息 here
#include 只需复制一个文件并将其粘贴到指定位置即可。更多关于 headers here
第一个示例有效,因为您包含了 header 并且代码如下所示:
/*
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,则需要包含 header。
您可以阅读有关预处理的更多信息here。如果要查看预处理器的输出,则需要使用 -E 标志,例如:gcc main.c -E -o mainPreprocessed.c
下次请将代码作为文本而不是图像添加 - 这样人们会更容易回答。
还有一件事:*.c 文件用于代码(您在 g++ 命令中添加),*.h 文件用于 headers(您使用 #include 包含)。
我有两个文件 main.c
和 header.c
。
main.c
有一些宏 STR
我想根据文件中的某些 #define
有条件地定义其值。
案例一:
当我在 main.c
文件中包含 header.c
时,程序运行正常,如下所示:
main.c
#include<stdio.h>
#define _flag_b
#include "header.c"
void main(){
printf("%s", STR);
}
header.c
#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.
案例二:
但出于某种原因,我想在编译命令中包含 header.c
而不是在 main.c
中。如下所示,这为我造成了这个问题:
main.c
#include<stdio.h>
#define _flag_b
// #include "header.c"
void main(){
printf("%s", STR);
}
header.c
#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 的每个实例都被替换为指定常数。有关宏的更多信息 here
#include 只需复制一个文件并将其粘贴到指定位置即可。更多关于 headers here
第一个示例有效,因为您包含了 header 并且代码如下所示:
/*
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,则需要包含 header。
您可以阅读有关预处理的更多信息here。如果要查看预处理器的输出,则需要使用 -E 标志,例如:gcc main.c -E -o mainPreprocessed.c
下次请将代码作为文本而不是图像添加 - 这样人们会更容易回答。
还有一件事:*.c 文件用于代码(您在 g++ 命令中添加),*.h 文件用于 headers(您使用 #include 包含)。