【问题标题】:How do I make macro constants globally accessible in C?如何在 C 中使宏常量全局可访问?
【发布时间】:2015-11-12 14:47:21
【问题描述】:

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

#define LOCAL_L2_BASE_LV                                    (0x00800000UL)

在 .c 文件中和

#define FPGA_PLI_FEEDBACK_OFFSET_LV_FREQUENCY           (0x00007000UL)

在.h文件中

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

【问题讨论】:

    标签: c macros extern


    【解决方案1】:

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

    【讨论】:

    • 但是我的宏常量之一是在 .c 文件中定义的。在这种情况下,仅包含包含其他宏定义的头文件是不够的。另一种选择是包含包含宏的 .c 文件,但我不确定这是否有效,即使是,这是否是一种安全做法?
    • 我也可以在当前的头文件中重新定义我需要的宏吗?
    • @FarhanAhmedWasim,当然,您不应该包含 .c 文件!您应该将宏定义从 .c 移动到适当的 .h 文件并包含它。是的,您可以重新定义宏,如果它们尚未定义,您甚至可以定义它们。但是,我怀疑你需要这个。
    【解决方案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;
    

    【讨论】:

    • 请注意,这些不是常量,而是 const 限定的变量。
    • @BlagovestBuyukliev 不,您不能在需要常量的地方使用 const 变量(这使得宏在这种情况下更胜一筹)。比 const 限定变量更好的另一件事是枚举(如果适用)。
    • 在大多数情况下它们是可以互换的(除了在初始化器中你需要一个常量表达式)。 OP 没有具体说明他的特定用例。
    • Const 限定变量不能用于静态/全局变量初始化、结构声明、案例标签、预处理器中、枚举初始化等。
    • @SergeyA:在 C++ 中,您可以在常量表达式(例如,大小写标签)中使用 const ints,但这是 C 语言,而在 C 语言中则不能。 ideone.com/1tOsaUideone.com/aH7exL
    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2022-08-17
      相关资源
      最近更新 更多