C + 外部声明 - 将它们放在哪里

标签 c header declaration extern

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

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

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

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

  • drv_adc.h:它有点属于 ADC 驱动程序,因此我可以将它添加到它的头文件中并在 main.c 中实例化它。
  • 我扭转逻辑并将外部声明放入我的 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 declaration 放在要包含在您的其他文件中的 header 中。这是因为我们声明它一次,告诉编译器只有 一个通用版本 标志变量可用于我们包含在 header 中的两个 drv 文件,因为阅读此讨论更清晰,Difference between putting variables in header vs putting variables in source .

关于C + 外部声明 - 将它们放在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15279453/

相关文章:

c - 将参数发送给#define

email - 内容传输编码 7 位或 8 位

windows - 无法更改 Windows Universal 应用程序中 Hub 控件的标题

C++ 指针延迟声明语法

c++ - 不同的 C++ 类声明

java - 使用JNI和java servlet还是CGI和C语言?

c - C 中的文件行计数器

swift - TableView 标题文本问题

c++ - `f();` 怎么可能是下面的声明呢?

c - C 中 main 内部和 main 外部的函数声明