我该如何避免这种链接错误?

时间:2010-05-26 06:50:31

标签: c

如果我在头文件中定义了一个全局变量(带初始化),并将该文件包含在两个文件中并尝试编译和链接,编译器会给出链接错误

headers.h:

#ifndef __HEADERS
#define __HEADERS
int x = 10;
#endif

1.C:

#include "headers.h"
main ()
{
}

2.C:

#include "headers.h"
fun () {}

4 个答案:

答案 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)

  1. 在ifndef中定义__HEADERS。
  2. 在标题中放置声明,而不是定义:
// 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 () {}