#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 是新增的关键字。