1

我想定义字符串常量以在我的C程序中的多个文件中使用。现在我以这种形式拥有它们:

file.h
#ifndef FILE_H_
#define FILE_H_

  static const char *id = "ID"

#endif

然而,虽然我在多个文件中使用了这个字符串,但我得到一个编译器警告,说这个变量没有被使用。如果我删除 static 关键字,我会收到一条错误消息,指出该变量有多个定义。

我怎样才能解决这个问题?

4

4 回答 4

2

(a) 将它们定义为预处理器宏#define ID "ID"(可能是 icky),或者 (b) 在一个源文件中定义它们并extern在头文件中声明它们。

在头文件中调用它们的静态变量会导致它们出现在每个编译单元中,这是不可取的。

于 2012-09-28T03:05:26.620 回答
1

您不应在头文件中定义变量,然后将其包含在多个源文件中。
对于非静态变量,它会导致违反One 定义规则,链接器会抱怨。

当您static在标题中定义 a 时,您得到的是包含该文件的每个翻译单元中的变量副本。这不能满足您对跨多个文件共享一个变量的要求。

有两种方法可以解决您的问题:


如果您想将其用作常量字符串,只需使用宏

#define ID "ID"  

并确保宏定义在您使用的任何地方都可见


如果您想在多个文件中使用它作为变量,只需使用extern.

文件.h

extern const char *id;

文件2.cpp

#include"file.h"

const char *id = "ID";

文件 3.cpp

#include"file.h"

//Use the variable
于 2012-09-28T03:05:43.103 回答
0

至少,GCC 不会对静态非指针常量发出警告:

static const char id[] = "ID";

您的版本的问题在于它创建了一个字符串文字,然后“丢弃”了指向它的指针。

于 2012-09-28T03:05:50.657 回答
0

我会使用一个宏 - 任何包含该头文件的文件都将其作为“常量”(它实际上只是在编译的预处理器阶段被替换):

#define ID "ID"
于 2012-09-28T03:07:48.503 回答