头文件中 ifndef/define/endif 有什么用?
1. 相同的声明可以多次出现,重复声明不是错误!
定义不可以,无论是单个文件还是多个文件,某个特定作用域(比如全局变量),不可以重复定义变量。
2. 类/结构体的定义可以在多个文件中多次出现,但是不可以在单个文件中多次出现;
3. 在C++头文件中,const和static定义的变量,可以被多个cpp包含而不报错,
但是会导致重复定义,内存开销较大,所以不要在头文件使用const或static定义变量!
4. #ifndef,#define在头文件开头,可以防止头文件的内容在单个文件多次出现,所以加上宏定义之后,就可以放心在头文件定义类了;
但是对多个文件包含同一头文件无效,所以即使加上宏定义,也不可以在头文件中定义变量,因为有被多个文件包含导致重复定义的风险。
5. 综上
①头文件一定要有条件编译判断:#ifndef,#define,可以避免头文件被同一源文件包含多次;
②对外使用的声明放在头文件;
③类的定义放在头文件
④不要在头文件使用const或static定义变量
头文件中 ifndef/define/endif 有什么用?的更多相关文章
- 头文件中ifndef/define/endif的作用以及#pragma once使用
例如:要编写头文件test.h 在头文件开头写上两行: #ifndef _TEST_H #define _TEST_H//一般是文件名的大写 ············ ············ 头文件 ...
- c/c++头文件中#ifndef/#define/#endif的用法
想必很多人都看过“头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文 ...
- C/C++头文件使用 #ifndef #define #endif 的原因
背景 在编译的时候,出现"redefine"的错误,最后检查才发现对应的头文件没有写正确的预编译信息: #ifndef _HeadFileName_H #define _HeadF ...
- C++ 中 #ifndef, #define, #endif 宏定义
目的:为了保证包含的内容只被程序(include) 和编译了一次.判断预处理器常量是否已被定义. 预编译将所有头文件(#include"XXX.h")用头文件中的内容来替换,头文件 ...
- 头文件中的#ifndef/#define/#endif 的作用
在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量重定义的错误.在头文件中实用#ifndef #define #endif能避免头文件的重定 ...
- [C++] 头文件中的#ifndef,#define,#endif以及#pragma用法
想必很多人都看过“头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文 ...
- 头文件里面的ifndef /define/endif的作用
c,c++里面,头文件里面的ifndef /define/endif的作用 今天和宿舍同学讨论一个小程序,发现有点地方不大懂······ 是关于头文件里面的一些地方: 例如:要编写头文件test.h ...
- C++头文件为什么要加#ifndef #define #endif
#ifndef 在头文件中的作用 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时 ,就会出现大量“重定义”的错误.在头文件中实用#ifndef #de ...
- 头文件为什么要加#ifndef #define #endif
#ifndef 在头文件中的作用 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时 ,就会出现大量“重定义”的错误.在头文件中实用#ifndef #de ...
- #ifndef #define #endif 防止头文件被重复引用
想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件 ...
随机推荐
- 2-2 C++变量
目录 2.2.1 变量定义:列表初始化(list initialization) 2.2.2 变量的定义与声明 C++分离式编译 定义与声明 2.2.3 C++变量命名 2.2.4 变量名的作用域(s ...
- 一键SSH免密脚本
大型项目一键SSH免密脚本 #!/usr/bin/env bash root=$( cd $(dirname $0)/.. pwd ) source ${root}/dragonrc read -p ...
- linux系统查看日志方法
linux查看日志可以使用tail.cat.less.grep等实现,linux系统的日志通常是存在/var/log中 1.使用cat命令:cat /var/log,log目录下还有多种类型的日志文件 ...
- typescript 接口和对象类型(四)
在typescript中,我们定义对象的方式要用关键字interface(接口), 使用interface来定义一种约束,让数据的结构满足约束的格式.定义方式如下: // 定义一个接口类型 int ...
- Spring常见面试问题
Spring 1. Spring工作机制及为什么要用? Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.Spring既是一个AOP框架,也是一IOC容器. SpringFra ...
- Understanding ANTLR Grammar Files
Are you confused by all the different sections of an Antlr grammar file, wondering what each one doe ...
- 【原创】linux实时操作系统xenomai看门狗(watchdog)机制及作用介绍
版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100.如有错误,欢迎指正. 目录 一.前言 PREEMPT-RT(RT Throttlin ...
- golang日志库之log
查看基本使用: package main import ( "log" ) type User struct { Name string Age int } func main() ...
- Jx.Cms开发笔记(七)-升级BootstrapBlazor到6.9.x
由于BootstrapBlazor升级到6.9以后的升级还是非常大的,比如图标库升级到了6.1.2,bs升级到了5.2.0.所以这里记录一下升级过程. 升级BootstrapBlazor主程序 直接升 ...
- VLC web(http)控制 (3) 播放控制
VLC web(http) 播放控制: 1.如果已经在打开视频 播放和暂停都是:http://127.0.0.1:8080/requests/status.xml?command=pl_pause ...