#pragma 指令作用是设定编译器的状态或者是指示编译器完成一些特定的动作
message 参数能够在编译信息输出窗口中输出相应的信息
#pragma message(“消息文本”)
code_seg参数能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它
#pragma code_seg( [“section-name”[,“section-class”] ] )
保证头文件被编译一次
#pragma once
pragma warning
#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示 4507 和 34 号警告信息
#pragma warning(once:4385) // 4385 号警告信息仅报告一次
#pragma warning(error:164) // 把 164 号警告信息作为一个错误。
#pragma warning( push [ ,n ] )
#pragma warning( pop )
#pragma warning( push ) :保存所有警告信息的现有的警告状态。
#pragma warning( push, n):保存所有警告信息的现有的警告状态,并且把全局警告等级设定为 n。
#pragma warning( pop ):向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消
将一个注释记录放入一个对象文件或可执行文件中
#pragma comment(…)
常用的 lib 关键字,可以帮我们链入一个库文件
#pragma comment(lib, “user32.lib”) // 该指令用来将 user32.lib 库文件加入到本工程中。
linker关键字将一个链接选项放入目标文件中
#pragma comment(linker, “/include:__mySymbol”)
# if !defined(BOOST_ASIO_NO_DEFAULT_LINKED_LIBS)
# if defined(UNDER_CE)
# pragma comment(lib, "ws2.lib")
# elif defined(_MSC_VER) || defined(__BORLANDC__)
# pragma comment(lib, "ws2_32.lib")
# if !defined(BOOST_ASIO_WINDOWS_APP)
# pragma comment(lib, "mswsock.lib")
# endif // !defined(BOOST_ASIO_WINDOWS_APP)
# endif // defined(_MSC_VER) || defined(__BORLANDC__)
# endif // !defined(BOOST_ASIO_NO_DEFAULT_LINKED_LIBS)
内存对齐
#pragma pack
// memAlign.c
// gcc memAlign.c -o memAlign
#include <stdio.h>
#include <stddef.h>
#pragma pack (4)
typedef struct st
{
char c; // 起始地址 0; 结束地址 1
int i; // 起始地址 4; 结束地址 8
double d; // 起始地址 8; 结束地址 16
}ST; // 结构体大小 16 字节
typedef struct st2
{
char c;
int i;
ST st;
double d;
char c2;
ST st_arr[3];
long l;
int i_arr[9];
}ST2;
#pragma pack ()
int main(void)
{
printf("c:%zu i:%zu st:%zu d:%zu c2:%zu st_arr:%zu l:%zu i_arr:%zu\n",
offsetof(ST2, c), offsetof(ST2, i), offsetof(ST2, st),
offsetof(ST2, d), offsetof(ST2, c2), offsetof(ST2, st_arr),
offsetof(ST2, l), offsetof(ST2, i_arr));
return 0;
}
#pragma pack(n) 的n只能是2的次方幂,目前测试了,n的值可以为1、2、3、8、16,当设置32时会报错
使用指令#pragma pack (n),编译器将按照 n 个字节对齐。
使用指令#pragma pack (),编译器将取消自定义字节对齐方式。
#pragma pack (4)
typedef struct st
{
char c; // 起始地址 0; 结束地址 1
int i; // 起始地址 4; 结束地址 8
double d; // 起始地址 8; 结束地址 16
}ST; // 结构体大小 16 字节
typedef struct st2
{
char c;
int i;
ST st;
double d;
char c2;
ST st_arr[3];
long l;
int i_arr[9];
}ST2;
#pragma pack ()
```go
#pragma pack (push) // 保存现在的对齐参数
#pragma pack (4) // 将对齐参数改为 4
typedef struct st
{
char c; // 起始地址 0; 结束地址 1
int i; // 起始地址 4; 结束地址 8
double d; // 起始地址 8; 结束地址 16
}ST; // 结构体大小 16 字节
typedef struct st2
{
char c;
int i;
ST st;
double d;
char c2;
ST st_arr[3];
long l;
int i_arr[9];
}ST2;
#pragma pack (pop) // 恢复之前保存的对齐参数
#pragma pack(push):保存当前对其方式到 packing stack;
#pragma pack(n):设置编译器按照 n 个字节对齐;
#pragma pack(pop):packing stack 出栈,并设置为对齐参数;
## 宏参数转换为字符串常量
#运算符
```go
// preDel#.c
// gcc preDel#.c -E -o preDel#.i //预编译
// gcc preDel#.c // 编译
#include <stdio.h>
#define MY_STR(x) #x
#define SQR(x) printf("The square of "#x" is %d.\n", ((x)*(x)));
#define CALL(fun) (printf("CALL %s\n", #fun), fun())
void function()
{
}
int main(void)
{
printf("%s\n", MY_STR(Hello world!));
SQR(8);
CALL(function); // 先打印函数名,再调用函数
return 0;
}
# 5 "preDel#.c" 2
void function()
{
}
int main(void)
{
printf("%s\n", "Hello world!");
printf("The square of ""8"" is %d.\n", ((8)*(8)));;
(printf("CALL %s\n", "function"), function());
return 0;
}
把宏参数跟一个字符串组合成一个符号
##运算符
// preDel##.c
// gcc preDel##.c -E -o preDel##.i //预编译
// gcc preDel##.c // 编译
#include <stdio.h>
#define __TXT_(name, ...) char g_txt_##name[]={__VA_ARGS__}
int main(void)
{
__TXT_(str1, "this is str1");
printf("str=[%s]\n",g_txt_str1);
return 0;
}
# 2 "preDel##.c" 2
int main(void)
{
char g_txt_str1[]={"this is str1"};
printf("str=[%s]\n",g_txt_str1);
return 0;
}