【问题标题】:C + extern declarations - Where to put themC + extern 声明 - 放在哪里
【发布时间】:2025-02-15 10:40:01
【问题描述】:

好的,我了解 extern 定义的工作原理,但我不知道放置它们的“最佳”位置是什么。考虑以下文件结构:

  • main.c / main.h / global.h
  • drv_adc.c / drv_adc.h
  • drv_pwm.c / drv_pwm.h

您可能会猜到,这对于小型微控制器来说很常见。这两个驱动程序在硬件的不同部分工作并且没有相互依赖关系。两个驱动程序都可以设置一个标志(例如:adc_irq_occured、pwm_irq_occured),它表明某些事情已经发生,并将在 main.c 中处理。

现在我可以想到两种方法来放置“extern bool adc_irq_occured;”标志。

  • drv_adc.h:它在某种程度上属于 ADC 驱动程序,因此我可以将它添加到它的头文件中并在 main.c 中实例化它。
  • 我扭转逻辑,将 extern 声明放入我的 main.h(或 global.h,如果必须如此)并在我的 drv_adc.c 中实例化它。

现在的问题是:这里的首选选项是哪个选项?有没有什么好书可以让我读到这些主题?

【问题讨论】:

    标签: c header declaration extern


    【解决方案1】:
    In main.c:
    int flag = 0;
    
    In main.h:  
    extern int myGlobal;
    
    
    In drv_adc.c: 
    #include "main.h"
    
    In drv_pwm.c:
    #include "main.h"
    

    现在这个变量是全局的,它的安全性较低,所以要谨慎使用它,并确保任何其他的drv文件都不会篡改它。

    -- 编辑-- 为什么不反过来呢?

    我们将extern 声明 放在要包含在您的其他文件中的标题中。这是因为我们声明一次,告诉编译器只有 一个通用版本标志变量可用于我们包含在标头中的两个 drv 文件,用于更清楚地阅读这个讨论,Difference between putting variables in header vs putting variables in source

    【讨论】:

    • 为什么不反过来呢?
    • @TomL。 ,已编辑我的帖子以删除我给您的其他荒谬建议,并且还包含了您评论的答案
    • 是的,这就是故事的重点。然而,想象一下:驱动程序是相互独立的,他们不需要相互了解。我只想让“main.c”知道他们两个,但不知道他们彼此。那么另一种方式不是更有意义(因为它限制了范围更多一点?)
    • 喜欢与否,一旦你有意地在两个文件之间共享一个全局变量,它们可以而且永远不会是独立的,即使看起来你“限制范围”,声明为 extern简单地说,变量将在链接期间来自另一个文件(因此范围在这里无关紧要)
    • 再想一想:如果我将 extern 声明放在 drv_adc.h 中并且 main.h 包含 drv_adc.h,那么 drv_pwm.c 将看不到它,从而限制了可见性 - 或我有这个问题吗?