2012-03-12 26 views
7

好全局常量,我期待定义一组内存地址为在的二手由一堆.c文件.h文件中的常量(我们是在C,不是C++)。我希望能够看到名称的变量,而不是只看到在调试器中的十六进制地址 ...所以我想我目前拥有的#define语句转换为在全球范围的常数。问题是,如果我将它们定义是这样的:不使用的#define

const short int SOME_ADDRESS = 0x0010 

然后我得到了可怕的“多次声明”的错误,因为我必须使用相同的.h多个.c文件。我想使用一个枚举,但这是行不通的,因为它默认输入整数(在我的系统上是16位......并且我需要更好地控制这个类型)。

我想过把所有的地址在一个结构......但我也没有办法(据我所知)设置在头文件结构的实例的默认值(我不想假设一个特定的.c文件首先使用结构和其他地方来填充它。我真的很喜欢在.h文件中定义的常量)

它似乎很简单,当我开始,但我不看到在头文件中定义一个全局可用的短整型常量的好方法...任何人都知道如何做到这一点?

谢谢!

回答

23

使用extern声明在头文件中的常量:

extern const short int SOME_ADDRESS; 

然后在任何,但只有一个,.c文件提供的定义:

const short int SOME_ADDRESS = 0x0010; 
+0

如果我这样做,会不会我也知道,那个特定的.c文件首次调用?或者如果它们是在.c文件中全局定义的,那么在调用任何函数之前定义是否会完成? – 2012-03-12 14:09:42

+0

不,没有什么可以调用来初始化常量,并且在尝试使用它们之前,定义将会出现。只要确保常量被定义的'.c'文件的'.o'(或'.obj')文件链接到最终的二进制文件中。 – hmjd 2012-03-12 14:12:56

+0

它的作品 - 谢谢! – 2012-03-12 14:20:18

0

如果你正在用gcc编译,您可以添加-ggdb3开关,它会告诉GCC来存储宏信息(即#define S),使他们能够GDB内部使用。