1.头文件中的#ifndef

头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。

还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:

#ifndef <标识>
#define <标识>

......
......

#endif

<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

#ifndef _STDIO_H_
#define _STDIO_H_

......

#endif

2.在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。

#ifndef AAA
#define AAA
...
int i;
...
#endif
里面有一个变量定义
在vc中链接时就出现了i重复定义的错误,而在c中成功编译。

结论:

(1).当你第一个使用这个头的.cpp文件生成.obj的时候,int i 在里面定义了当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int i 又被定义然后两个obj被另外一个.cpp也include 这个头的,连接在一起,就会出现重复定义.

(2).把源程序文件扩展名改成.c后,VC按照C语言的语法对源程序进行编译,而不是C++。在C语言中,若是遇到多个int i,则自动认为其中一个是定义,其他的是声明。

(3).C语言和C++语言连接结果不同,可能(猜测)时在进行编译的时候,C++语言将全局
变量默认为强符号,所以连接出错。C语言则依照是否初始化进行强弱的判断的。(参考)

解决方法:

(1).把源程序文件扩展名改成.c。

(2).推荐解决方案:
.h中只声明 extern int i;在.cpp中定义

<x.h>
#ifndef __X_H__
#define __X_H__
extern int i;
#endif //__X_H__
<x.c>
int i;

注意问题:

(1).变量一般不要定义在.h文件中。

#ifndef#define#endif的用法(整理)相关推荐

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

    想必很多人都看过"头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用".但是是否能理解"被重复引用"是什么意思?头文件被重复 ...

  2. #ifndef.#define, #endif 的用法

    文件中的#ifndef.#define, #endif 很关键,是为了避免多重包含,比如如果两个C文件同时包含同一头文件,那么就会出现问题,所以使用这种方法可以有效避免这种情况. 一般用法: 以add ...

  3. #ifndef#define#endif的用法

    你所遇到的这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是"条件编译&qu ...

  4. C++ ifndef /define/ endif 作用和用法

    ifndef/define/endif"主要目的是防止头文件的重复包含和编译 比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件 ...

  5. ifndef/define/endif——主要目的是防止头文件的重复包含和编译

    原文:http://www.jb51.net/article/100939.htm 原文:https://blog.csdn.net/abc5382334/article/details/180527 ...

  6. #pragma once 和 #ifndef ... #define ... #endif 的区别

    这两者都是为了防止文件被包含多次.但是有些细微的区别: 1,来源的区别:#pragma once 是编译系统相关的,由编译器提供.而#ifndef ...#define ... #endif 是c/c ...

  7. #ifndef #defin #endif的用法

    #ifndef #defin #endif的用法: 1. 当有两个c文件,并且两个c文件都include了同一个头文件,在编译为同一个可运行文件时就会产生大量声明冲突. 所以就需要将头文件的内容都放在 ...

  8. c:#ifndef, #define, #endif 作用

    #ifndef, #define, #endif 作用 #ifndef 它是if not define 的简写,是宏定义的一种,实际上确切的说,这应该是预处理功能三种(宏定义.文件包含.条件编译)中的 ...

  9. [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较

    C++中防止头文件被多次include 的常见方式有: 1) 用#ifndef ...  #define ... #endif  宏 #ifndef __MYHEADER_H__ #define __ ...

最新文章

  1. ORB_SLAM2单目初始化策略
  2. kicad绿油开窗_GitHub - OS-Q/S05: KiCad EDA
  3. 用串口电缆实现双机互联(图)
  4. java 反射创建对象并赋值_[原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)...
  5. C中文件的输入输出与C++的文件流
  6. python 怎么表示阶乘_python表示阶乘
  7. XML文件处理总结 - 1
  8. phpstorm 常用快捷键及自定义快捷键
  9. ZoomIt使用教程
  10. 微信小程序----实现YDUI的ScrollNav组件(滚动导航)
  11. mac电脑怎么清空浏览器缓存?Chrome浏览器 for Mac清理缓存的方法
  12. 【KD】2022 计算机学报 深度学习中知识蒸馏研究综述
  13. Office2010打开多个excel文件时,开多个excel而不是同一个切换
  14. ‘primordial is not defined‘ node 报错解决方法 终极篇!!
  15. stm32智能小车设计
  16. 贝叶斯统计之三种信息
  17. Linkflow新锐洞察 06 | DTC品牌如何快速规模化?
  18. ORACLE 11GR2 配置GATEWAY FOR SERVER 问题
  19. 迷你星域冒险服务器维护中,迷你世界星域冒险攻略 星域冒险快速通关技巧[多图]...
  20. 强智科技教务系统学科成绩c语言,湖南强智科技教务系统python模拟登录并爬取成绩(财院)...

热门文章

  1. 制作Tomcat的Dockerfile
  2. 为什么亚马逊、Facebook等纷纷推出儿童版?
  3. CPFair:推荐系统的个性化消费者和生产者公平重新排序
  4. EasyConnect连接公司的电脑并操作
  5. 劫持流量是什么,常见的流量劫持手法有哪些呢?
  6. 模糊控制——理论基础(3模糊关系及其运算)
  7. Android通讯录之快速获取联系人
  8. python实现顺序查找
  9. android smartbar,android seekbar 踩坑之路
  10. 「数据库教程」MySQL删除数据库