如何在C中全局访问宏常量?

时间:2015-11-12 14:47:22

标签: c macros extern

我在.c文件和.h文件中定义了一些宏常量,如下所示:

#define LOCAL_L2_BASE_LV                                    (0x00800000UL)
<。>在.c文件和

#define FPGA_PLI_FEEDBACK_OFFSET_LV_FREQUENCY           (0x00007000UL)
<。>文件中的

我想在不同的头文件中使用这些常量。这样做的最佳方法是什么?我最初的想法是在头文件中使用extern我想使用常量,但这是否有效?

3 个答案:

答案 0 :(得分:6)

宏不能是外部的,它们不是变量。它们只是文本替代品。要使宏可用于其他标头,您需要包含定义宏的标头。

答案 1 :(得分:2)

您应该将两个定义放在头文件中(以便它们可以从任何其他源文件中看到),或者在源文件中将它们定义为const限定变量并在标题中使用extern文件以将它们公开给其他翻译单元。

头文件中的extern声明如下所示:

extern const unsigned long k_local_l2_base_lv;
extern const unsigned long k_fpga_pli_feedback_offset_lv_freq;

然后,您可以在源文件的文件范围内使用外部链接定义它们,如下所示:

const unsigned long k_local_l2_base_lv = 0x00800000UL;
const unsigned long k_fpga_pli_feedback_offset_lv_freq = 0x00007000UL;

答案 2 :(得分:2)

您不能将extern用于宏,因为它们会在链接之前展开。

一种方法是使用您需要的定义创建标题,并将其包含在您需要的位置。

另一种方法是将定义传递给编译器(假设你正在使用gcc):

gcc -DLOCAL_L2_BASE_LV=0x00800000UL source.c -o executable

第一个解决方案似乎更好,因为它将代码保存在源代码中(而不是构建过程)。

此外,在这种特定情况下,值的括号不是必需的,因为它形成一个令牌,并且它将被扩展。