zoukankan      html  css  js  c++  java
  • #pragma once vs #ifndef

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

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

  • 相关阅读:
    WEB免费打印控件推荐
    json.net 反序列化
    PHP文件显示乱码
    ASP.NET服务开启后Session丢失的解决方法
    phpmyadmin 下载
    phpMyAdmin 错误 缺少 mysqli 扩展。请检查 PHP 配置
    解决IE6IE7下li上下间距
    获取IP地址方法
    Winform中DataGridView的DataGridViewCheckBoxColumn使用方法(选中与选不中)
    IIS配置PHP5.3配置完成后FastCGI Error14001 (0x800736b1)___解决方法
  • 原文地址:https://www.cnblogs.com/gaox97329498/p/11900671.html
Copyright © 2011-2022 走看看