C - 预处理命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C - 预处理命令相关的知识,希望对你有一定的参考价值。

#define name [string]
  宏定义. 在编译预处理时, 对程序中所有出现的宏名, 都将使用宏定义中的字符串来替换
  ... 变参, 用于传递可变参数列表, 可使用__VA_ARGS__来获取可变参数列表

#define debug(...)             printf(__VA_ARGS__)
#define debug(format, ...)        printf(format, __VA_ARGS__)
#define debug(format, args...)    printf(format, args)

  #   字符串化, 给相应的参数加上双引号
  #@  单字符化, 给相应的参数加上单引号, 并将其视为一个字符(微软特定)
  ## 连接, 将两个参数连接在一起, 形成一个标记

#define ToString(x) #x
#define ToChar(x)   #@x
#define Conn(x,y)   x##y

char* str = ToString(1234); /* str = "1234" */
char a = ToChar(1); /* a = ‘1‘ */
int n = Conn(123, 456); /* n = 123456 */
char* str2 = Conn("qwer", "asdf"); /* str2 = "qwerasdf" */

 #line number ["filename"]
  #line 用于重置由__LINE__和__FILE__宏指定的行号和文件名

#line 1000 "lukas.c" /* 行号设置为1000,文件名设置为lukas.c */

#error token-string
  #error 将使编译器停止编译, 并打印出包含该记号序列的诊断信息

#if !defined(__cplusplus)
#error C++ compiler required. /* 如果不使用C++的编译器, 那么这一行(除注释外)将会被打印出来 */
#endif

#pragma para
   #pragma 用于设定编译器的状态或者是指示编译器完成一些特定的动作
   每个编译器对#pragma的实现不同, 编译指示是机器或操作系统专有的

  #pragma message("消息文本")
    能够在编译信息输出窗口中输出响应的信息
  #pragma code_seg(["section-name" [,"sectio-class"]])
     能够设置程序中函数代码存放的代码段, 当我们开发驱动程序的时候就会用到它
  #pragma once
    在头文件的最开始的地方加入这条指令, 就能保证头文件只会被编译一次
    与编译器相关, 兼容性差. 如果要实现跨平台, 最好使用#ifndef来替换
  #pragma hdrstop
    表示预编译头文件到此为止, 后面的头文件不再进行编译
  #pragma resource "*.dfm"
    表示把*.dfm文件中的资源加入工程. *.dfm中包括窗体外观的定义
  #pragma comment(comment-type[,"comment-string"])
    将一个注释记录放入一个对象文件或可执行文件中
    comment-type 指定注释的类型, 是一个预定义的标识符, 应该是compiler,exestr,lib,linker之一
      compiler: 放置编译器的版本或者名字到一个对象文件, 该选项是被linker忽略的
      exestr: 在以后的版本中将被取消
      lib: 连入一个库文件
      linker: 指定一个连接选项, 这样就不用在命令行输入或者在开发环境中设置了
    comment-string 是一个提供为comment-type提供附加信息的字符串
  #pragma disable
    在函数前声明, 只对一个函数有效, 指示该函数的调用过程将不可中断

  #pragma data_seg(["shared-data"])
    建立一个新的数据段, 并定义共享数据
    一般用于在DLL中定义一个共享的有名字的数据段, 这个数据段中的全局变量可以被多个进程共享

#pragma data_seg("shareddata")
HWND sharedwnd = NULL; /* 共享数据, 必须被初始化, 否则会共享失败 */
#pragma data_seg()

  #pragma region name #pragma endregion comment
    Visaul C++ 中特有的预处理指令, 它可以让你折叠特定的代码块

#pragma region Variables
HWND hWnd;
const size_t Max_Length = 20;
//other variables
#pragma endregion This region contains global variables.

  #pragma pack(n)
    指定结构体以n字节对齐

#pragma pack(push) /* 保存对齐状态 */
#pragma pack(4) /* 设定为4字节对齐 */
struct test {
    char m1;
    double m4;
    int m3;
};
#pragma pack(pop) /* 恢复对齐状态 */

  #pragma warning(...)

#pragma warning(disable:450734;once:4385;error:164)
/* 等价于 */
#pragma warning(disable:450734) /* 不显示4507号和34号警告信息 */
#pragma warning(once:4385) /* 对4385号警告信息只报告一次 */
#pragma warning(error:164) /* 把164号警告信息作为一个错误 */
        
/* 同时, #pragma warning 也支持如下格式: */
#pragma warning(push[,n]) /* 保存所有警告信息的现有警告状态, 并把全局警告等级设定为n(1~4) */
#pragma warning(pop) /* 向栈中弹出最后一个警告信息 */
        
/* 在入栈和出栈之间所做的一切改动, 将在出栈后重新保存 */
#pragma warning(push)
#pragma warning(disable:4705)
#pragma warning(disable:4706)
#pragma warning(disable:4707)
/* ....... */
#pragma warning(pop) /* 重新保存所有的警告信息(包括4705,4706和4707) */

其他预处理命令
  #include    文件包含
  #if x          条件编译
  #elif x       else if (x)
  #ifdef x     等同于 #if defined(x)
  #ifndef x   等同于 #if !defined(x)
  #else
  #endif
  #undef x   终止宏定义(x)的作用域
EOF

以上是关于C - 预处理命令的主要内容,如果未能解决你的问题,请参考以下文章

C语言的预处理命令

C#-C#-#define条件编译

define定义变量

可以使用命令define定义变量吗

C#-#define条件编译

#ifdef vs #if defined 的差异