#define用于定义宏,宏在源代码展开时被处理。

#define 中使用参数

#define ADD(x,y) x+y 

用宏创建字符串

#define PSOR(X) printf("sasds "#X"  ")

int main()
{

PSOR(12);

return 0;
}

预处理粘合剂:##运算

#define XNAME(n)  x ## n
#define PRINT_INT(n) printf(" "x" #n " = %d
",x ## n)

int main()
{
int XNAME(1) = 14;// int x1 = 14
PRINT_INT(1); // printf("x1 =%d
",x1);

return 0;
}

变量宏...和_ _VA_ARGS_ _

#define PR(...) printf(_ _ VR_ARGS_ _)
#define PR(X,...) printf("Message " #X " : " _ _VA_ARGS_ _ )

  #include 指令用于包含其他文件

#include<stdio.h>  在系统目录中寻找该文件

#inclde"mystuff.h" 在当前目录中寻找该文件

#undef 用于取消已定义的#define指令

#define LIMIT 400

#undef LIMIT

条件编译

#ifdef,#else,#endi,#ifndef

#if,#elif

#if指令很像C语言中的if,#if后面跟整形常量表达式,如果表达式为非零,则表达式为真。

#if SYS == 1
    #include "ibmpc.h"
#elif SYS == 2
    #include "mac.h"
#else
    #include "general.h"
#endif

预定义宏

含义
_ _DATE_ _ 预处理日期("Mmm dd yyyy形式的字符串字面量",如Nov 23 2013)
_ _FILE_ _ 表示当前源代码文件名的字符串字面量
_ _LINE_ _ 表示当前源代码文件中行号的整型变量
_ _STDC_ _ 设置为1事,表示实现遵循C标准
_ _STDC_HOSTED_ _ 本机环境设置为1,否则设置为0
_ _STDC_VERSION_ _ 支持99标准,设置为199901L,支持11标准,设置为201112L
_ _TIME_ _ 翻译代码的时间,格式为"hh:mm:ss"

C99标准提供了一个名为_ _func_ _的预定义标识符,它展开为一个代表函数名的字符串

int main()
{

printf("cur func is %s",_ _func_ _); //输出main
return 0;
}

#line 和 #error

#line 指令重置_ _LINE_ _和_ _FILE_ _宏报告的行号和文件名。

#line 100 //把当前行号重置为100
#line 10 "cool.c" //行号重置为100 文件名重置为cool.c

#error可以让预处理器发出一条错误信息,如果可能的话,编译过程应该中断。

#if _ _STD_VERSION_ _  != 201112L

#error Not c11

#endif

#pragma

在现代编译器中,可以通过命令行参数修改编译器一些设置,#pragma把编译器指令放入源代码中,例如,在开发C99时,标准称为C9X,可以使用下面这个指令让编译器支持C9X。

#pragma c9x on

一般而言,编译器都有自己的编译指示集,例如,编译指示可能用于控制分配给自动变量的内存量,或者设置错误检查的严格程度,或者启动非标准语言特性等。

泛型选择

泛型编程是指那些没有特定类型,但是一旦指定一种类型,就可以转换成指定类型的代码。例如,C++中的模版中可以创建泛型算法,然后编译器自动根据指定的类型自动使用实列化代码。C11新增了泛型选择表达式。

#define MYTYPE(X) _Generic((X),int :"int",default:"other")
_Generic 是新增的关键字。
原文地址:https://www.cnblogs.com/shuiyonglewodezzzzz/p/10977092.html