C中的字符串常量

时间:2012-09-28 03:02:22

标签: c compilation c-preprocessor c-strings

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

file.h
#ifndef FILE_H_
#define FILE_H_

  static const char *id = "ID"

#endif

但是,虽然我在多个文件中使用此字符串,但我收到编译器警告,说明此变量未被使用。如果我删除static关键字,我会收到一个错误,说该变量有多个定义。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

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


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

#define ID "ID"  

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


如果您想将其用作多个文件中的可用文件,只需使用extern即可。

file.h

extern const char *id;

<强> file2.cpp

#include"file.h"

const char *id = "ID";

file3.cpp

#include"file.h"

//Use the variable

答案 2 :(得分:0)

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

static const char id[] = "ID";

您的版本存在的问题是它会创建一个字符串文字,然后“抛弃”指向它的指针。

答案 3 :(得分:0)

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

#define ID "ID"