首先我们要理解定义和声明的区别,举个常见的例子,比如有一个common.c文件中有这样一句话
int var = 7;
然后其对应的common.h文件中有这样一句:
int var;
那么上面一句叫做“定义”,下面一句叫“声明”。
定义为变量分配了存储空间,而声明没有。
声明可有多处,而定义只能在一处.声明不能做初始化.
下面是网友的话:
声明是告诉编译器“我存在!”。定义是告诉编译器“我是干什么的!”。
就象你去图书馆
声明:我们图书馆里有这本书。
定义:书的内容
在ucos2操作系统源码中,出现了全局宏定义这个东西,虽然初学起来有点困难,一但掌握,写起程序来会更灵活。
一个庞大的程序会有不少的全局变量存在,为了使代码整洁,将全局变量定义在了一个文件中,比如在common.c中。
#include "common.h"
int a = 10;
char buf[50] = "china";
a和buf就是全局变量。在common.h中对两个变量进行了声明,如下:
#ifndef COMMON_H_INCLUDED
#define COMMON_H_INCLUDED
#define OS_COMMON
int a;
char buf[50];
#endif // COMMON_H_INCLUDED
然后我如果想在main.c文件中使用他们,怎么办,可以直接用extern int a;声明外部变量,就可以用。也可以#include
“commmon.h” 然后就可以直接用了。在没有其他文件的干预下两种方法都可以,没有任何问题。但是,如果工程很庞大,main.c包含了若干个(很多个)头文件
//main.c
#include "a.h"
#include "b.h"
#include "c.h"
#include "d.h"
你知道这些模块中有没有包含过common.h呢。如果包含了,那么再extern int a;就会出错。
分享到:
相关推荐
3. **考虑宏的可见性**:避免在头文件中定义全局宏,因为这可能会导致不同文件中的宏发生冲突。可以考虑使用局部宏或者使用命名空间来限制宏的作用范围。 4. **测试宏的正确性**:由于宏定义在编译预处理阶段完成,...
单片机宏定义是一种编程技巧,它可以简化代码编写工作,提高程序的可读性和维护性。宏定义通常用在需要反复使用某段代码,且这些代码本质上不会改变的情况下。在单片机编程中,宏定义可以用于简化寄存器操作、控制...
宏定义的另一个常见问题是名字空间污染,因为它们是全局的。 函数模板和宏定义在实际开发中各有适用场合。对于通用性的算法和操作,函数模板是首选,因为它提供了类型安全性和更好的可维护性。而在对性能有极高要求...
平常在开发的时候会用到各种颜色RGB值定义,很多时候需要到绘图里查看各颜色的RGB值。该头文件把各种颜色进行了宏定义,使用时只要包含该头文件即可。 不仅能够加快开发速度,还能使颜色值更加明了,方便阅读代码。
- **使用 `add_definitions`**:这是一种全局设置宏定义的方式,适用于整个项目。该命令会将宏定义添加到所有目标的编译指令中。 - **使用 `target_compile_definitions`**:这是一种更精细的控制方式,可以为特定的...
2. 全局宏定义在文件中从定义处起到文件结束都有效,函数内宏定义只在函数内有效。 3. 宏定义可以控制代码的编译行为,例如条件包含(#if...#endif)。 4. 宏可以用来替代函数,实现某些计算功能。 5. 宏定义可以...
通过将宏定义放在特定的结构内,可以模拟简单的命名空间,避免全局名字冲突。但这并不是真正的面向对象编程中的命名空间。 8. **使用#undef取消宏定义**: 如果不再需要某个宏定义,可以使用`#undef`来取消它的...
建立一个最简单的工程基于StdPeriph_Lib(IAR)需要经过八个步骤:新建工程文件、源文件组织、添加源文件、配置工程、设置头文件搜索路径、设置全局宏定义、设置链接脚本、设置仿真器。只有遵循这些步骤,才能确保整个...
### 20个C语言中常用宏定义总结 #### 1. 防止一个头文件被重复包含 ```c #ifndef COMDEF_H #define COMDEF_H // 头文件内容 #endif ``` **解释**:这个宏定义用于防止同一个头文件被多次包含。在C语言中,头文件...
3. **名字冲突**:宏定义的标识符全局有效,容易与其他标识符产生冲突。 4. **缩进问题**:宏展开后可能会导致代码格式混乱,影响可读性。 为了避免这些问题,现代C++引入了模板和`constexpr`等特性,它们在某些...
#### 2.3 全局宏定义 这些宏定义用于标识特定的芯片特性和配置选项: - `CHIP_ENDIAN_BIG` 和 `CHIP_ENDIAN_LITTLE`: 定义了芯片的大端或小端存储顺序。 - `CHIP_MAP_0` 和 `CHIP_MAP_1`: 可能是指定了某些地址...
3. **全局宏定义**:除了上述提到的宏定义外,还需要对全局宏定义进行调整,以确保程序能够在指定的硬件平台上正确运行。 4. **栈空间配置**:为了支持更多的任务运行,通常需要增加栈空间的大小。这可以通过修改...
### 嵌入式C宏定义详解 #### 防止一个头文件被重复包含 在C编程中,经常需要使用头文件来定义全局变量、函数原型等。为了避免头文件被重复包含导致的问题,通常会使用预处理指令来实现保护。 ```c #ifndef COMDEF_...
STM32无阻塞控制LED,可以设置LED占空比和闪烁次数,采用TIM精确定时,采用宏定义定义数字,全局变量在头文件中声明,采用静态全局变量避免变量暴露; 2. 使用说明: 通过修改宏定义可以修改开关时间; 通过查看...
宏定义、结构体定义、函数声明以及全局变量定义放到一个head.h头文件中 函数的定义放到head.cpp中 main函数放到main.cpp中 然而却报错了,提示xxx变量在*.obj文件中已定义 问题出现的原因 为什么会出现这种...
C语言常规优化策略 参数传递、宏定义、全局变量与汇
接下来,修改全局宏定义。STM32系列有不同的内存配置,如低密度(LD)、中密度(MD)和高密度(HD)。这些宏定义(如STM32F10X_LD、STM32F10X_MD和STM32F10X_HD)用于区分不同内存大小的芯片,并控制标准外设库(STM...
本文将深入探讨TCP/IP协议的实现,并结合提供的插图进行详细解释,同时也会提及书中涉及的全局变量、宏定义以及部分函数描述。 首先,TCP/IP协议栈分为四层模型,分别是应用层、传输层、网络层和链路层。在应用层,...
**源码分析神器SourceInsight 4.0与Quicker.em宏定义** SourceInsight是一款深受程序员喜爱的源代码分析工具,它以其强大的代码浏览、查找、跳转和编辑功能,极大地提升了开发者的工作效率。而Quicker.em是针对...
该文详细介绍了全局变量宏的定义,并给出了实例,对编程水平的提高有很大的帮助!