#pragma once vs #ifndef
2024-08-31 22:30:42
最后编辑: 2019-11-20
#pragma once 是一个非标准但被广泛支持的预处理符号, 其主要作用是防止文件重复引入问题。 在头文件中,可以定义 #pragma once
或者 #ifndef
, 本文比较以下这两者区别。
#pragma once
#ifndef __ARCH_ARM_SRC_ARTOSYN_AR_UART_H
#define __ARCH_ARM_SRC_ARTOSYN_AR_UART_H
#endif
共同点
防止文件重复 include
在以前的一些编译系统中,为了提高编译的效率,编译系统各自开发了 #pragma once
来防止文件重复 include。(非标准但被广泛支持!!)
随着后来的开发,编译器层面对 #ifndef
进行了优化, 目前的编译速度上两者并没有差别。
不同点
#pragma once
不可用于 gcc 3.4 之前版本;#ifndef
有个问题在于,你需要定义一个宏,如上面的__ARCH_ARM_SRC_ARTOSYN_AR_UART_H
, 一般这种宏以_前缀_文件名_H
形式,如果文件名做了更改,那么你也需要更改这个里面宏;- 如果在不同的地方存在同名的文件,文件里面使用
#ifndef
定义的宏是一样的,链接编译的时候会收到一个警告, 使用#pragma once
没有任何异常。
.
├── hello.c
├── hello.h
├── main.c
└── Src
├── hello.c
└── hello.h
main 函数
#include <stdio.h>
#include <stdlib.h>
#include "hello.h"
#include "./Src/hello.h"
int main(int argc, char **argv)
{
say_hello();
say_hello_in_src();
exit(0);
}
gcc main.c hello.c ./Src/hello.c -o a.out
警告
main.c: In function ‘main’:
main.c:9:5: warning: implicit declaration of function ‘say_hello_in_src’ [-Wimplicit-function-declaration]
say_hello_in_src();
在实际开发中,多目录下存在相同文件名的形式非常的少见,也就意味着你可以自由选择
最新文章
- 在Mac OS X Yosemite 10.10.3 中搭建第一个 ASP.NET 5 Web 项目
- 使用中国版 Office 365 -- Team Site分享
- ubuntu 12.04下zmap安装
- lr中定义字符串变量
- 一个 11 行 Python 代码实现的神经网络
- cpp quiz
- C#中的可空类型
- Redis命令小细节
- Oracle- 查询误删数据
- 【Qt】测测你对Qt的了解–Qt工具知多少
- 【转】prufer编码
- Android反编译APK
- teamviewer无法启动
- zoj1940(三维广搜)
- 加快XCode编译链接速度(200%+)—XCode编译慢液
- 一步步教你读懂NET中IL(附带图)
- live555—VS2010/VS2013 下live555编译、使用及测试(转载)
- 还在纠结 Flux 或 Relay,或许 Redux 更适合你
- Java数据库连接--JDBC基础知识(操作数据库:增删改查)
- Python求解数组重新组合求最小值(优酷)