#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; 結束地址 1int i; // 起始地址 4; 結束地址 8double 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; 結束地址 1int i; // 起始地址 4; 結束地址 8double 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; 結束地址 1int i; // 起始地址 4; 結束地址 8double 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" 2void 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" 2int main(void)
{char g_txt_str1[]={"this is str1"};printf("str=[%s]\n",g_txt_str1);return 0;
}