如果我在头文件中定义了一个全局变量(带初始化),并将该文件包含在两个文件中并尝试编译和链接,编译器会给出链接错误
headers.h:
#ifndef __HEADERS
#define __HEADERS
int x = 10;
#endif
1.C:
#include "headers.h"
main ()
{
}
2.C:
#include "headers.h"
fun () {}
答案 0 :(得分:5)
链接器抱怨,因为一旦将所有目标文件放在一起创建可执行文件,就会有x
的多个定义。您有两个不同的源文件,包括相同的头文件,并且该头文件定义了一个值为10的变量x
,因此最终得到两个x
定义(1.c和另一个在2.c)。
要避免多个定义链接器错误,请将其放在头文件中(例如globals.h
):
#ifndef GLOBALS_H
#define GLOBALS_H
/*
* The "extern" keyword means that this variable is accessible everywhere
* as long as this declaration is present before it is used. It also means
* that the variable x may be defined in another translation unit.
*/
extern int x;
#endif
然后将其放入一个源文件中:
#include "globals.h"
int x = 10;
答案 1 :(得分:1)
// header
extern int x;
// implementation
int x = 10;
3。 2.c包含错误。
所以:
// headers.h
#ifndef __HEADERS
#define __HEADERS
extern int x;
#endif
// 1.c
#include "headers.h"
int x = 10;
main ()
{
}
// 2.c
#include "headers.h"
fun () {}
您可以在任何地方定义x。把它放在一个地方。
答案 2 :(得分:1)
这是一个经典案例,您需要声明或声明和定义的变量。
如果在两个源文件中定义它,将获得双定义链接器错误。处理此问题的一种方法是仅为其中一个源文件设置__HEADERS
,以便它是定义变量的文件。
所有其他源文件仅获得声明。
>>headers.h
#ifndef __HEADERS
int x = 10;
#else
extern int x;
#endif
>>1.c
#define __HEADERS
#include "headers.h"
int main (void) {
return 0;
}
>>2.c
#include "headers"
void fun (void) {
}
当然,如果您在两个源文件中意外定义__HEADERS
,最好将定义完全保留在头文件中。尝试:
>>headers.h
extern int x;
>>1.c
#include "headers.h"
int x = 10;
int main (void) {
return 0;
}
>>2.c
#include "headers"
void fun (void) {
}
答案 3 :(得分:1)
#include与从头文件中复制并粘贴文本完全相同。
以这种方式考虑它,您会看到您已将行int x=10
放入两者源文件中。
固定版本如下:
>>headers.h
#ifndef __HEADERS
#define__HEADERS
extern int x; // extern tells the compiler it will be linked from another file
#endif
-----------------
>>1.c
#include "headers.h"
int x = 10; // must have it in ONE file for linking purposes
main ()
{
}
---------------------
>>2.c
#include "headers"
fun () {}