我有以下“常量”标题:
/* constants.h */
#ifdef __cplusplus
extern "C" {
#endif
#pragma once
#ifndef CONSTANTS_H
#define CONSTANTS_H
const char * kFoo = "foo";
const char * kBar = "bar";
#endif
#ifdef __cplusplus
}
#endif
我#include
- 在文件X.c
和Y.c
中添加此标头。
请注意,我不包括X.h
或Y.h
。
文件X.c
和Y.c
被编译为目标文件,这些文件存档到名为libXY.a
的静态库中。
当我在X.h
中加入Y.h
和Z.h
时,以及当我链接到libXY.a
时,我无法正确编译Z.c
:
/* Z.h */
#include "X.h"
#include "Y.h"
尝试编译Z.c
时出现以下编译错误:
/path/to/libXY.a(X.o):(.data+0x0): multiple definition of `kFoo`
/path/to/libXY.a(Y.o):(.data+0x0): first defined here
/path/to/libXY.a(X.o):(.data+0x8): multiple definition of `kBar`
/path/to/libXY.a(Y.o):(.data+0x8): first defined here
我尝试将kFoo
和kBar
设置为extern
,但这没有帮助。
当我只包含一次常量(通过标题保护#ifndef CONSTANTS_H
)时,如何解析多个定义?
答案 0 :(得分:9)
当我只包含一次常量(通过标题保护#ifndef CONSTANTS_H)时,如何解析多个定义?
在constants.h
:
const char * kFoo = "foo";
kFoo
#include
的每个翻译都会发出constants.h
的定义。因此,多个定义,然后导致链接错误。
asaelr注意到(+1),你会这样解决:
constants.h
extern const char* const kFoo;
constants.c
const char* const kFoo = "foo";
(注意我也使指针const,通常你想在这种情况下做什么)
答案 1 :(得分:4)
您不应在头文件中定义变量。在其中一个源文件中定义它们,并在头文件中声明它们(extern
)。
(你写过“我已经尝试过将kFoo和kBar设置为extern,但这没有帮助。”我猜你没有在源文件中定义它们)