如何使宏常量在 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
第一个解决方案似乎更好,因为它将代码保存在源代码中(与构建过程相反)。
此外,在这种特定情况下,值周围的括号不是必需的,因为它形成了一个单独的标记,并且将按此展开。
我在.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
第一个解决方案似乎更好,因为它将代码保存在源代码中(与构建过程相反)。
此外,在这种特定情况下,值周围的括号不是必需的,因为它形成了一个单独的标记,并且将按此展开。