`
东边日出西边雨
  • 浏览: 262739 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

全局宏定义

    博客分类:
  • c
阅读更多

      首先我们要理解定义和声明的区别,举个常见的例子,比如有一个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;就会出错。

 

 

 

 

分享到:
评论

相关推荐

    C++宏定义说明(详解)

    3. **考虑宏的可见性**:避免在头文件中定义全局宏,因为这可能会导致不同文件中的宏发生冲突。可以考虑使用局部宏或者使用命名空间来限制宏的作用范围。 4. **测试宏的正确性**:由于宏定义在编译预处理阶段完成,...

    单片机宏定义学习手记

    单片机宏定义是一种编程技巧,它可以简化代码编写工作,提高程序的可读性和维护性。宏定义通常用在需要反复使用某段代码,且这些代码本质上不会改变的情况下。在单片机编程中,宏定义可以用于简化寄存器操作、控制...

    函数模板与宏定义

    宏定义的另一个常见问题是名字空间污染,因为它们是全局的。 函数模板和宏定义在实际开发中各有适用场合。对于通用性的算法和操作,函数模板是首选,因为它提供了类型安全性和更好的可维护性。而在对性能有极高要求...

    C++中各种颜色宏定义

    平常在开发的时候会用到各种颜色RGB值定义,很多时候需要到绘图里查看各颜色的RGB值。该头文件把各种颜色进行了宏定义,使用时只要包含该头文件即可。 不仅能够加快开发速度,还能使颜色值更加明了,方便阅读代码。

    编译器宏定义的艺术:在CMake中精准设置

    - **使用 `add_definitions`**:这是一种全局设置宏定义的方式,适用于整个项目。该命令会将宏定义添加到所有目标的编译指令中。 - **使用 `target_compile_definitions`**:这是一种更精细的控制方式,可以为特定的...

    lwip--有趣的数组定义(预处理)

    2. 全局宏定义在文件中从定义处起到文件结束都有效,函数内宏定义只在函数内有效。 3. 宏定义可以控制代码的编译行为,例如条件包含(#if...#endif)。 4. 宏可以用来替代函数,实现某些计算功能。 5. 宏定义可以...

    常用宏定义#define

    通过将宏定义放在特定的结构内,可以模拟简单的命名空间,避免全局名字冲突。但这并不是真正的面向对象编程中的命名空间。 8. **使用#undef取消宏定义**: 如果不再需要某个宏定义,可以使用`#undef`来取消它的...

    建立一个最简单工程-基于StdPeriph_Lib(IAR).doc

    建立一个最简单的工程基于StdPeriph_Lib(IAR)需要经过八个步骤:新建工程文件、源文件组织、添加源文件、配置工程、设置头文件搜索路径、设置全局宏定义、设置链接脚本、设置仿真器。只有遵循这些步骤,才能确保整个...

    20个C语言中常用宏定义总结

    ### 20个C语言中常用宏定义总结 #### 1. 防止一个头文件被重复包含 ```c #ifndef COMDEF_H #define COMDEF_H // 头文件内容 #endif ``` **解释**:这个宏定义用于防止同一个头文件被多次包含。在C语言中,头文件...

    编程常用宏定义.rar

    3. **名字冲突**:宏定义的标识符全局有效,容易与其他标识符产生冲突。 4. **缩进问题**:宏展开后可能会导致代码格式混乱,影响可读性。 为了避免这些问题,现代C++引入了模板和`constexpr`等特性,它们在某些...

    DSP DM642 库文件

    #### 2.3 全局宏定义 这些宏定义用于标识特定的芯片特性和配置选项: - `CHIP_ENDIAN_BIG` 和 `CHIP_ENDIAN_LITTLE`: 定义了芯片的大端或小端存储顺序。 - `CHIP_MAP_0` 和 `CHIP_MAP_1`: 可能是指定了某些地址...

    USB设备-虚拟USB摄像头(FreeRTOS)程序说明1

    3. **全局宏定义**:除了上述提到的宏定义外,还需要对全局宏定义进行调整,以确保程序能够在指定的硬件平台上正确运行。 4. **栈空间配置**:为了支持更多的任务运行,通常需要增加栈空间的大小。这可以通过修改...

    嵌入式c宏定义

    ### 嵌入式C宏定义详解 #### 防止一个头文件被重复包含 在C编程中,经常需要使用头文件来定义全局变量、函数原型等。为了避免头文件被重复包含导致的问题,通常会使用预处理指令来实现保护。 ```c #ifndef COMDEF_...

    STM32无阻塞控制LED,可以设置LED占空比和闪烁次数,采用TIM精确定时,采用宏定义定义数字,全局变量在头文件中声明。

    STM32无阻塞控制LED,可以设置LED占空比和闪烁次数,采用TIM精确定时,采用宏定义定义数字,全局变量在头文件中声明,采用静态全局变量避免变量暴露; 2. 使用说明: 通过修改宏定义可以修改开关时间; 通过查看...

    C/C++语言中全局变量重复定义问题的解决方法

    宏定义、结构体定义、函数声明以及全局变量定义放到一个head.h头文件中 函数的定义放到head.cpp中 main函数放到main.cpp中 然而却报错了,提示xxx变量在*.obj文件中已定义 问题出现的原因 为什么会出现这种...

    C语言常规优化策略 参数传递、宏定义、全局变量与汇.doc

    C语言常规优化策略 参数传递、宏定义、全局变量与汇

    程序移植到别的芯片怎改1

    接下来,修改全局宏定义。STM32系列有不同的内存配置,如低密度(LD)、中密度(MD)和高密度(HD)。这些宏定义(如STM32F10X_LD、STM32F10X_MD和STM32F10X_HD)用于区分不同内存大小的芯片,并控制标准外设库(STM...

    tcp/ip协议2实现的插图的汇总,汇总了这 8 篇文章的所有插图 还有全书的全局变量、宏定义,部分函数描述的 xls 文件

    本文将深入探讨TCP/IP协议的实现,并结合提供的插图进行详细解释,同时也会提及书中涉及的全局变量、宏定义以及部分函数描述。 首先,TCP/IP协议栈分为四层模型,分别是应用层、传输层、网络层和链路层。在应用层,...

    SourceInsight4.0使用的Quicker.em宏定义

    **源码分析神器SourceInsight 4.0与Quicker.em宏定义** SourceInsight是一款深受程序员喜爱的源代码分析工具,它以其强大的代码浏览、查找、跳转和编辑功能,极大地提升了开发者的工作效率。而Quicker.em是针对...

    全局变量宏的定义及使用

    该文详细介绍了全局变量宏的定义,并给出了实例,对编程水平的提高有很大的帮助!

Global site tag (gtag.js) - Google Analytics