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

How do I make macro constants globally accessible in C?

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

#define LOCAL_L2_BASE_LV                                    (0x00800000UL)

在 .c 文件中和

#define FPGA_PLI_FEEDBACK_OFFSET_LV_FREQUENCY           (0x00007000UL)

在 .h 文件中

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

宏不能做成extern,它们不是变量。它们只是文本替换。要使其他 header 可以使用宏,您需要包含定义宏的 header。

您应该将这两个定义放在头文件中(以便它们在任何其他源文件中可见),或者在源文件中将它们定义为 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;

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

一种方法是使用您需要的定义创建一个 header 并将其包含在您需要的地方。

另一种方法是像这样将定义传递给编译器(假设您使用的是 gcc):

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

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

此外,在这种特定情况下,值周围的括号不是必需的,因为它形成了一个单独的标记,并且将按此展开。