C语言 #pragma指令
简介
#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; }