我想在 C 程序中定义用于多个文件的字符串常量。现在我以这种形式拥有它们:
file.h
#ifndef FILE_H_
#define FILE_H_
static const char *id = "ID"
#endif
但是,虽然我在多个文件中使用此字符串,但我收到编译器警告,说明此变量未被使用。如果我删除static关键字,我会收到一个错误,说该变量有多个定义。
我该如何解决这个问题?
答案 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"