69

我定义了一个特殊文件:config.h

我的项目也有文件:

t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp

和#包括:

在 tc 中:

    #include "t.h"
    #include "b.h"
    #include "pp.h"
    #include "config.h"

在公元前:

    #include "b.h"
    #include "pp.h"

在pp.c中:

    #include "pp.h"
    #include "config.h"

在 l.cpp 中:

    #include "pp.h"
    #include "t.h"
    #include "config.h"

我的文件中没有包含指令*.h,只有*.c文件中。我在 config.h 中定义了这个:

const char *names[i] =
        {
            "brian", "stefan", "steve"
        };

并需要 l.cpp、tc、pp.c 中的该数组,但我收到此错误:

pp.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
t.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [link] Error 1

*.h我在项目中使用的每个文件中都包含了警卫。任何帮助解决这个问题?

4

3 回答 3

148

不要在标题中定义变量。将声明放在头文件中,并将定义放在 .c 文件之一中。

在 config.h

extern const char *names[];

在一些 .c 文件中:

const char *names[] = { 
  "brian", "stefan", "steve" };

如果将全局变量的定义放在头文件中,则此定义将转到包含此头文件的每个 .c 文件,并且您将收到多次定义错误,因为变量可能被声明多次但只能定义一次.

此外,如果您必须在头文件中定义变量,您还可以做一件事,您可以使用static关键字。

static const char *names[] = {
  "brian", "stefan", "steve" };

这种方式变量names将在整个程序中仅定义一次,并且可以多次访问。

于 2013-07-20T17:23:35.683 回答
46

公共函数的声明放在头文件中,是的,但定义在头文件中也是绝对有效的!如果您在实用程序函数的标头中定义您不想在每个 c 文件中再次定义的东西,您可以将定义声明为静态(整个程序只允许 1 个副本)。IE 定义了一个枚举和一个静态函数以将枚举转换为字符串。然后,您不必为每个包含标头的 .c 文件将枚举重写为字符串转换器。:)

于 2014-08-15T19:12:50.377 回答
0

使您的定义在头文件中保持静态。

于 2022-02-07T04:58:48.090 回答