最后编辑: 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 进行了优化, 目前的编译速度上两者并没有差别。 

不同点

  1. #pragma once 不可用于 gcc 3.4 之前版本;
  2. #ifndef 有个问题在于,你需要定义一个宏,如上面的 __ARCH_ARM_SRC_ARTOSYN_AR_UART_H, 一般这种宏以 _前缀_文件名_H 形式,如果文件名做了更改,那么你也需要更改这个里面宏;
  3. 如果在不同的地方存在同名的文件,文件里面使用 #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();

在实际开发中,多目录下存在相同文件名的形式非常的少见,也就意味着你可以自由选择

最新文章

  1. 在Mac OS X Yosemite 10.10.3 中搭建第一个 ASP.NET 5 Web 项目
  2. 使用中国版 Office 365 -- Team Site分享
  3. ubuntu 12.04下zmap安装
  4. lr中定义字符串变量
  5. 一个 11 行 Python 代码实现的神经网络
  6. cpp quiz
  7. C#中的可空类型
  8. Redis命令小细节
  9. Oracle- 查询误删数据
  10. 【Qt】测测你对Qt的了解–Qt工具知多少
  11. 【转】prufer编码
  12. Android反编译APK
  13. teamviewer无法启动
  14. zoj1940(三维广搜)
  15. 加快XCode编译链接速度(200%+)—XCode编译慢液
  16. 一步步教你读懂NET中IL(附带图)
  17. live555—VS2010/VS2013 下live555编译、使用及测试(转载)
  18. 还在纠结 Flux 或 Relay,或许 Redux 更适合你
  19. Java数据库连接--JDBC基础知识(操作数据库:增删改查)
  20. Python求解数组重新组合求最小值(优酷)

热门文章

  1. vue学习【一】vue引用封装echarts并展示多个echarts图表
  2. 用原生js来写一个swiper滑块插件
  3. 点击切换JS
  4. 移远模组-BC95-工作模式之间关系
  5. centos6和centos7的区别和常用的简单配置优化
  6. MMU功能解析、深入剖析、配置与使用
  7. 自学Python-基于tcp协议的socket
  8. ip正则
  9. 牛客练习赛44 B 小y的线段 (思维)
  10. dedecms织梦移站后替换数据库中文件路径命令