C+;外部声明-将它们放在何处

C+;外部声明-将它们放在何处,c,header,declaration,extern,C,Header,Declaration,Extern,好吧,我理解extern的定义是如何工作的,但我不知道什么是放置它们的“最佳”位置。考虑以下文件结构: main.c/main.h/global.h drv_adc.c/drv_adc.h drv_pwm.c/drv_pwm.h 您可能会猜到,这对于小型微控制器来说是很常见的。这两个驱动程序在硬件的不同部分上工作,并且没有相互依赖性。两个驱动程序都可以设置一个标志(例如:adc\u irq\u Occursed,pwm\u irq\u Occursed),指示发生了什么事情,并且将在main

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

  • main.c/main.h/global.h
  • drv_adc.c/drv_adc.h
  • drv_pwm.c/drv_pwm.h
您可能会猜到,这对于小型微控制器来说是很常见的。这两个驱动程序在硬件的不同部分上工作,并且没有相互依赖性。两个驱动程序都可以设置一个标志(例如:adc\u irq\u Occursed,pwm\u irq\u Occursed),指示发生了什么事情,并且将在main.c中处理

现在,我可以想到两种方法,我将把“extern bool adc\u irq\u occurrend;”标记放在其中

  • drv_adc.h:它在某种程度上属于adc驱动程序,因此我可以将其添加到头文件中,并在main.c中对其进行实例化
  • 我改变逻辑,将extern声明放在main.h(或者global.h,如果必须的话)中,并在我的drv_adc.c中实例化它
现在的问题是:哪个选项是这里的首选选项?有什么好书可以让我读到这些话题吗

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
声明放在标题中,该标题将包含在您的其他文件中。这是因为我们声明了一次,告诉编译器只有一个通用版本的flag变量可用于两个drv文件(我们包含在标题中),为了更清楚,请阅读本讨论

既然这个变量是全局变量,那么它就不那么安全了,所以请谨慎使用它,并确保任何其他drv文件都不会篡改它

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


我们将
extern
声明放在标题中,该标题将包含在您的其他文件中。这是因为我们声明了一次,告诉编译器只有一个通用版本的flag变量可用于两个drv文件(我们包含在标题中),为了更清楚,请阅读本讨论。

为什么不反过来呢?@TomL,我编辑了我的帖子,删除了我给你的另一个荒谬的建议,还包括了你评论的答案是的,这是故事的一个要点。然而,想象一下:驾驶员彼此独立,他们不需要相互了解。我只想让“main.c”知道他们两个,但不想让他们彼此知道。那么,另一种方式是否更有意义(因为它限制了范围多一点?)喜欢还是不喜欢,一旦您有意在两个文件之间共享一个全局变量,它们就可以而且永远不会是独立的,即使您似乎“限制范围”,声明为extern仅仅意味着,在链接过程中,该变量将来自另一个文件(因此这里的作用域并不重要)。请再想一想:如果我将extern声明放在drv_adc.h和main.h中,包括drv_adc.h,那么它对drv_pwm.c不可见,从而限制了可见性-或者我有这个错误吗?为什么不反过来做呢?@TomL,我编辑了我的帖子,删除了我给你的另一个荒谬的建议,还包括了你评论的答案是的,这是故事的一个要点。然而,想象一下:驾驶员彼此独立,他们不需要相互了解。我只想让“main.c”知道他们两个,但不想让他们彼此知道。那么,另一种方式是否更有意义(因为它限制了范围多一点?)喜欢还是不喜欢,一旦您有意在两个文件之间共享一个全局变量,它们就可以而且永远不会是独立的,即使您似乎“限制范围”,声明为extern仅仅意味着,在链接过程中,该变量将来自另一个文件(因此这里的作用域并不重要)。请再想一想:如果我将extern声明放在drv_adc.h中,而main.h包含drv_adc.h,那么它对drv_pwm.c不可见,从而限制了可见性——或者我有这个错误吗?