通常情况下,都是在C文件中定义全局变量,在头文件中声明,但是,如果我们定义的全局变量需要被很多的C文件使用的话,那么将全局变量定义在头文件里面会方便很多,那到底是如何实现的?

os_var.c文件内容

 #define OS_GLOBALS
#include “os.h”

os.h文件内容

 #ifdef OS_GLOBALS
#define OS_EXT
#else
#define OS_EXT extern
#endif

  os.h中定义很多的全局变量,但是os.h又需要被很多的c文件调用,如果不特殊处理的话,会出现全局变量多次定义的错误,为了实现在os.h中定义全局变量,在os.h的开头加入上面os.h文件内容中的宏定义,且在全局变量前面都加上“OS_EXT”,然后单独定义一个os_var.c文件,然后包含os.h,且只在这个文件里面定义宏“OS_GLOBALS”,在其他包含os.h的文件中,都不定义宏“OS_GLOBALS”,那么在编译的时候,只有os_var.c里面的os.h里面的全局变量前面的OS_EXT才展开为空,其他文件中包含的os.h中的全局变量前面的OS_EXT就展开为extern,即声明,而不是定义,这样就实现了在os.h中定义全局变量。

  os.h是uC/OS-III的总的头文件,里面定义了很多的全局变量,而且这个头文件会被很多的C文件调用,为了防止重复定义全局变量的问题,故采取了上面的方法,即单独新建一个C文件os_var.c,然后在这个C文件里面定义OS_GLOBALS这个宏,然后再包含os.h这个头文件。那么只有在编译os_var.c的时候,os.h里面的全局变量才是定义,其它c文件里面的os.h的变量都是声明,因为其它C文件我们不会定义OS_GLOBALS这个宏。

C语言之在头文件中定义全局变量的更多相关文章

  1. c语言头文件中定义全局变量的问题

    c语言头文件中定义全局变量的问题 (转http://www.cnblogs.com/Sorean/) 先说一下,全局变量只能定义在 函数里面,任意函数,其他函数在使用的时候用extern声明.千万不要 ...

  2. C语言头文件中定义全局变量导致重复定义错误

    合作方升级SDK后,程序编译出现变量重复定义的错误,通过错误提示无法找到什么位置重复定义了,但确定是引入新SDK后才出现的错误,从SDK的头文件中查找,最终发现在头文件中定义了全局变量 我们的项目在多 ...

  3. [Linux][C][gcc][tips] 在头文件中定义变量引发的讨论

    概述 本人的原创文章,最先发表在github-Dramalife-note中.转载请注明出处. Define variable(s) in header file referenced by mult ...

  4. C++ vector 实现二维数组时, 在类的头文件中定义时遇到"应输入类型符"的问题?

    见下,当我在类的声明文件中定义二维vector时,提示我应输入类型说明符; 但是相同的格式定义,在类中将二维vector修改为在源文件中定义就可以顺利通过,并顺利执行打印 打印结果如下: 望大神来解惑 ...

  5. 在C的头文件中定义的结构体,如何在cpp文件中引用

    解决方案1:在cpp文件中放置.c,且在该文件中引用变量 解决方案2:在一个cpp文件中包含.c,但在另一个cpp文件中使用结构体变量 cpp文件1 cpp文件2 #include "dia ...

  6. [C/C++]在头文件中使用static定义变量意味着什么

    文章出处:http://www.cnblogs.com/zplutor/ 看到有一位同学在头文件中这么写: static const wchar_t* g_str1 = - static const ...

  7. C语言中定义全局变量

    (1)在C语言的头文件中定义变量出现的问题 最好不要傻嘻嘻的在头文件里定义什么东西.比如全局变量: /*xx头文件*/ #ifndef  _XX_头文件.H #define  _XX_头文件.H in ...

  8. c/c++头文件中#ifndef/#define/#endif的用法

    想必很多人都看过“头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文 ...

  9. 不要在.h文件中定义变量

    今天在头文件.h中初始化了一个数组和函数,在编译的时候提示这个数组和函数重新定义了,检查后发现,犯了一个致命的错误,在头文件中定义变量... 以下引用别人的一篇说明,警示自己. C语言作为一种结构化的 ...

随机推荐

  1. iOS去除数组中重复的model数据

    // 去除数组中model重复 ; i < self.selectedModelArray.count; i++) { ;j < self.selectedModelArray.count ...

  2. 仿flash运动框架

    github地址: [https://github.com/linxd5/pictureShow] PS: 新建一个github项目很简单,只要new一个repo,后面按照提示做就可以了~ 项目思路: ...

  3. 使用PhantomJS

    PhantomJS是一个基于WebKit的服务器端JavaScript API.它全面支持Web而无需浏览器支持,不仅运行快,原生支持各种web标准:DOM处理.CSS选择器.JSON.Canvas, ...

  4. ubuntu搭建ssh服务

    本人在ubuntu16.4.4.0-13下测试 #man uname//用于打印系统信息 sudo apt install update sudo apt install openssh-server ...

  5. .net core cookie滑动过期设置

    HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, userPrincipal, new Authe ...

  6. python-Web-django-图形验证

    import random def get_random_color(): return (random.randint(0, 255), random.randint(0, 255), random ...

  7. 微信路由navigateTo

    // pages/index/index.js Page({ /** * 页面的初始数据 */ data: { res:2 }, search: function(e) { var that = th ...

  8. C++学习笔记-const

    const在C++中有着大量的运用,深刻理解const有助于进一步理解C++. const基础知识 int main() { const int a;//C++中必须初始化 int const b;/ ...

  9. alembic的使用

  10. Numpy科学计算

    NumPy介绍   NumPy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组. NumPy支持常见的数组和矩阵操作.对于同样的数值计算任务,使用Nu ...