#ifndef#define#endif的用法(整理)
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的用法(整理)相关推荐
- c/c++头文件中#ifndef/#define/#endif的用法
想必很多人都看过"头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用".但是是否能理解"被重复引用"是什么意思?头文件被重复 ...
- #ifndef.#define, #endif 的用法
文件中的#ifndef.#define, #endif 很关键,是为了避免多重包含,比如如果两个C文件同时包含同一头文件,那么就会出现问题,所以使用这种方法可以有效避免这种情况. 一般用法: 以add ...
- #ifndef#define#endif的用法
你所遇到的这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是"条件编译&qu ...
- C++ ifndef /define/ endif 作用和用法
ifndef/define/endif"主要目的是防止头文件的重复包含和编译 比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件 ...
- ifndef/define/endif——主要目的是防止头文件的重复包含和编译
原文:http://www.jb51.net/article/100939.htm 原文:https://blog.csdn.net/abc5382334/article/details/180527 ...
- #pragma once 和 #ifndef ... #define ... #endif 的区别
这两者都是为了防止文件被包含多次.但是有些细微的区别: 1,来源的区别:#pragma once 是编译系统相关的,由编译器提供.而#ifndef ...#define ... #endif 是c/c ...
- #ifndef #defin #endif的用法
#ifndef #defin #endif的用法: 1. 当有两个c文件,并且两个c文件都include了同一个头文件,在编译为同一个可运行文件时就会产生大量声明冲突. 所以就需要将头文件的内容都放在 ...
- c:#ifndef, #define, #endif 作用
#ifndef, #define, #endif 作用 #ifndef 它是if not define 的简写,是宏定义的一种,实际上确切的说,这应该是预处理功能三种(宏定义.文件包含.条件编译)中的 ...
- [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较
C++中防止头文件被多次include 的常见方式有: 1) 用#ifndef ... #define ... #endif 宏 #ifndef __MYHEADER_H__ #define __ ...
最新文章
- ORB_SLAM2单目初始化策略
- kicad绿油开窗_GitHub - OS-Q/S05: KiCad EDA
- 用串口电缆实现双机互联(图)
- java 反射创建对象并赋值_[原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)...
- C中文件的输入输出与C++的文件流
- python 怎么表示阶乘_python表示阶乘
- XML文件处理总结 - 1
- phpstorm 常用快捷键及自定义快捷键
- ZoomIt使用教程
- 微信小程序----实现YDUI的ScrollNav组件(滚动导航)
- mac电脑怎么清空浏览器缓存?Chrome浏览器 for Mac清理缓存的方法
- 【KD】2022 计算机学报 深度学习中知识蒸馏研究综述
- Office2010打开多个excel文件时,开多个excel而不是同一个切换
- ‘primordial is not defined‘ node 报错解决方法 终极篇!!
- stm32智能小车设计
- 贝叶斯统计之三种信息
- Linkflow新锐洞察 06 | DTC品牌如何快速规模化?
- ORACLE 11GR2 配置GATEWAY FOR SERVER 问题
- 迷你星域冒险服务器维护中,迷你世界星域冒险攻略 星域冒险快速通关技巧[多图]...
- 强智科技教务系统学科成绩c语言,湖南强智科技教务系统python模拟登录并爬取成绩(财院)...