#pragma简介
(1)#pragma用于指示编译器完成一些特定的动作
(2)#pragma所定义的很多指示字是编译器特有的
(3)#pragma在不同的编译器间不可移植
预处理器将忽略它不认识的#pragma指令
不同的编译器可能以不同的方式解释同一条#pragma指令

一般用法:
#pragma parameter
注意:不同的parameter参数语法和意义各不相同

#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

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

#ifndef FILE_H
#define FILE_H

#endif

#pragma once
区别:
#pragma once:告诉预处理器当前文件只处理一次,保证头文件只被只编译一次,效率高
#ifndef FILE_H
#define FILE_H
#endif:包含了多次头文件,通过宏的方式保证只能嵌入一次,但预处理器还是处理了多次,从效率上说,效率低
**结合使用方法:**保证了编译效率,也保证了一次性

#ifndef _GLOBAL_H_
#define _GLOBAL_H_
#pragma once
int g_val = 1;

#endif

#pragma pack:指定内存对齐
#pragma pack()能够改变编译器的默认对齐方式
struct占用的内存大小
(1)第一个成员起始于0偏移处
(2)每一个成员按其类型大小和pack参数中较小的一个进行对齐
偏移地址必须能被对齐参数整除
结构体成员的参数大小取其内部长度最大的数据成员作为其大小
(3)结构体总长度必须为所有对齐参数的整数倍

编译器在默认情况下按照4字节对齐

#include <stdio.h>

#pragma pack(8)

struct S1
{                   //对齐参数  偏移地址    大小
    short a;        //2         0           2   
    long b;         //4         4           4
};

struct S2
{
    char c;         //1         0           1
    struct S1 d;    //4         4           8
    double e;       //8         16          8
//gcc不支持8字节对齐   4          12         8
};
//结构体成员的参数大小取其内部长度最大的数据成员作为其大小
//偏移地址必须能被对齐参数整除
//gcc编译器不支持8字节对齐
#pragma pack()

int main()
{
    printf("%d\n", sizeof(struct S1));
    printf("%d\n", sizeof(struct S2));

    return 0;
}

#pragma pack(1)
struct Test1
{
    char c1;
    short s;
    char c2;
    int i;
};
#pragma pack(1)
struct Test2
{
    char c1;
    char c2;
    short s;
    int i;
};
sizeof(struct Test1) = 8;
sizeof(struct Test1) = 8;

gcc编译器不支持8字节对齐

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐