标签:arch 头文件 function 编译器 Once std 异常 不同 共同点
最后编辑: 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();
标签:arch 头文件 function 编译器 Once std 异常 不同 共同点
原文地址:https://www.cnblogs.com/gaox97329498/p/11900671.html