C语言 #pragma指令

发布时间 2023-06-08 23:23:02作者: 寒魔影

简介

#pragma 指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的, 且对于每个编译器都是不同的
#pragma 用于指示编译器完成一些特定的动作
#pragma 所定义的很多指示字是编译器特有的
#pragma 在不同的编译器间是不可移植的
预处理器将忽略它不认识的 #pragma 指令
不同的编译器可能以不同的方式解释同一条 #pragma 指令

一般用法: 

#pragma parameter

#pragma message

参数在大多数的编译器中都有相似的实现
参数在编译时输出消息到编译输出窗口中
用于条件编译中可提示代码的版本信息

注意:和#error, #warning 不同,#pragma message 仅仅代表一条编译消息,不代表程序错误。

#include <stdio.h>

#define ANDROID20

#if defined(ANDROID20)
#pragma message("Compile Android SDK 2.0...")
#define VERSION "Android 2.0"
#elif defined(ANDROID23)
#pragma message("Compile Android SDK 2.3...")
#define VERSION "Android 2.3"
#elif defined(ANDROID40)
#pragma message("Compile Android SDK 4.0...")
#define VERSION "Android 4.0"
#else
#error Compile Version is not provided!
#endif

int main()
{
    printf("%s\n", VERSION);
    return 0;
}

#pragma once

用于保证头文件只被编译一次
是编译器相关的,不一定被支持

#ifndef _GTC_CORE_H_INCLUDED_
#define _GTC_CORE_H_INCLUDED_
  
#endif

该模式被C语言支持,但是并非只包含一次头文件而是包含多次,然后通过宏控制是否嵌入到源代码中,预处理器在其中处理了多次,效率上不如 #pragma once
但是 #pragma once 不一定所有编译器都支持,因此提供如下写法

#ifndef _GTC_CORE_H_INCLUDED_
#define _GTC_CORE_H_INCLUDED_
  
#pragma once
  
#endif

#pragma pack

指定数据在内存中的对齐方式

#pragma pack(n)
编译器将按照n个字节对齐

#pragma pack()
取消自定义字节对齐方式

#pragma pack(push,1)
是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐

#pragma pack(pop)
恢复对齐状态

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma pack(4)

struct Test1
{
    char m1;
    double m2;
    int m3;
};

#pragma pack()

struct Test2
{
    char m1;
    double m2;
    int m3;
};


int main(int argc, char* argv[])
{
    printf("sizeof(struct Test1): %d\n", sizeof(struct Test1));    // 打印 16
    printf("sizeof(struct Test2): %d\n", sizeof(struct Test2));    // 打印 24
    return 0;
}