我想定义字符串常量以在我的C程序中的多个文件中使用。现在我以这种形式拥有它们:
file.h
#ifndef FILE_H_
#define FILE_H_
static const char *id = "ID"
#endif
然而,虽然我在多个文件中使用了这个字符串,但我得到一个编译器警告,说这个变量没有被使用。如果我删除 static 关键字,我会收到一条错误消息,指出该变量有多个定义。
我怎样才能解决这个问题?
我想定义字符串常量以在我的C程序中的多个文件中使用。现在我以这种形式拥有它们:
file.h
#ifndef FILE_H_
#define FILE_H_
static const char *id = "ID"
#endif
然而,虽然我在多个文件中使用了这个字符串,但我得到一个编译器警告,说这个变量没有被使用。如果我删除 static 关键字,我会收到一条错误消息,指出该变量有多个定义。
我怎样才能解决这个问题?
(a) 将它们定义为预处理器宏#define ID "ID"
(可能是 icky),或者 (b) 在一个源文件中定义它们并extern
在头文件中声明它们。
在头文件中调用它们的静态变量会导致它们出现在每个编译单元中,这是不可取的。
您不应在头文件中定义变量,然后将其包含在多个源文件中。
对于非静态变量,它会导致违反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
至少,GCC 不会对静态非指针常量发出警告:
static const char id[] = "ID";
您的版本的问题在于它创建了一个字符串文字,然后“丢弃”了指向它的指针。
我会使用一个宏 - 任何包含该头文件的文件都将其作为“常量”(它实际上只是在编译的预处理器阶段被替换):
#define ID "ID"