最后编辑: 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();

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

#pragma once vs #ifndef的更多相关文章

  1. #pragma once 与 #ifndef 解析(转载)

    正在入门驱动编程,遇到一个小问题,如下详细解释. 原文链接:#pragma once 与 #ifndef 解析 http://www.cnblogs.com/hokyhu/archive/2009/0 ...

  2. 【转载】#pragma once与#ifndef

    本篇随笔为转载,原贴地址:#pragma once与#ifndef解析 为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式.在 ...

  3. C++ pragma once 与 ifndef 用法区别

    #pragma once 与 #ifndef 的作用 (1)在C/C++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性. (2)在能够支持这两种方式的编译器上,二者并没有太大的 ...

  4. #pragma once与#ifndef #define ...#endif的区别

    1. #pragma once用来防止某个头文件被多次include: #ifndef,#define,#endif用来防止某个宏被多次定义.   2. #pragma once是编译相关,就是说这个 ...

  5. #pragma once与 #ifndef的区别

      为了避免同一个文件被include多次 1   #ifndef方式2   #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别.   ...

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

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

  7. pragma once与#ifndef的作用有什么区别

    #pragma once 这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次 #pragma once用来防止某个头文件被多次include,#ifndef,#defi ...

  8. #pragma once 与 #ifndef 解析

    转自:http://www.cnblogs.com/hokyhu/archive/2009/03/30/1425604.html 为了避免同一个文件被include多次,C/C++中有两种方式,一种是 ...

  9. C/C++中宏定义#pragma once与 #ifndef的区别

    为了避免同一个文件被include多次,我们可以通过以下两种方式来进行宏定义: 1. #ifndef方式2. #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两 ...

随机推荐

  1. GitHub从小白到熟悉<一>

    注册开始

  2. 从入门到自闭之Python自定义模块

    自定义模块 定义:一个文件就是一个模块(能被调用的文件,模块就是一个工具箱,工具就是函数) 作用: 将代码文家化管理,提高可读性,避免重复代码 拿来就用(避免重复造轮子),python中类库比较多,提 ...

  3. 使用JavaScript实现字符串格式化

    使用JavaScript实现字符串格式化 String.prototype.format = function (kwargs) { /* hello-{n}-{m} {'n':'word','m': ...

  4. Bat批处理文件入门

    这个东西吧,感觉在使用windows时作用不是很大,毕竟在windows环境下命令行确实用的比较少,但有时候也会用到,比如测试算法程序时使用批处理+文件可以省去每次手动输入.赶巧最近对批处理也比较感兴 ...

  5. Flask-migrate基本使用方法

    数据库迁移操作顺序: 1.python 文件 db init 2.根据需求修改模型 3.python flaskapp文件 db migrate -m"新版本名(注释)" 4.py ...

  6. vue-router实现原理

    vue-router实现原理 近期面试,遇到关于vue-router实现原理的问题,在查阅了相关资料后,根据自己理解,来记录下.我们知道vue-router是vue的核心插件,而当前vue项目一般都是 ...

  7. vs编译项目报错:The OutputPath property is not set for this project

    今天使用VS2008编译项目时报错: The OutputPath property is not set for this project.  Please check to make sure t ...

  8. java 枚举enum的使用(与在switch中的使用)

    实际开发中,很多人可能很少用枚举类型.更多的可能使用常量的方式代替.但枚举比起常量来说,含义更清晰,更容易理解,结构上也更加紧密.看其他人的博文都很详细,长篇大论的,这里理论的东西不说了,一起看看在实 ...

  9. TensorFlow入门——bazel编译(带GPU)

    这一系列基本上是属于我自己进行到了那个步骤就做到那个步骤的 由于新装了GPU (GTX750ti)和CUDA9.0.CUDNN7.1版本的软件,所以希望TensorFlow能在GPU上运行,也算上补上 ...

  10. pip 报错找不到pip问题

    具体报错如下 解决办法: wget https://bootstrap.pypa.io/get-pip.py  --no-check-certificate 使用当前python3运行