C语言宏定义
#define 宏名称 替代文字
#define 宏名称([参数名称]) 替代文字
#define 宏名称([参数名称,]…) 替代文字
#undef 宏名称
#ifdef MAVIS
#include “A.h”//如果已经定义了MAVIS,则执行下面的指令
#define STABLES 5
#else
#include “B.h” //如果没有定义MAVIS,则执行下面的指令
#define STABLES 10
#endif
#ifndef XXX 同理表示没有定义过XXX
#define Size 100
#endif
#if SYS=="1"
#include "xxx.h"
#elif SYS=="2"
#include "yyy.h"
#else
#include "zzz.h"
#endif
#line 100 //把当前行号重置为100
#line 10 "cool.c" //把当前行号重置为10,并把文件名重置为cool.c
#if __STDC_VERSION__!=201112L
#error Not C11 //如果编译器支持C11标准则编译成功,否则报错
#endif
#pragma c9x on //让编译器支持c9x
_Pragma("nonstandardtreatmenttypeB on")
等价于下面这行
#pragma nonstandardtreatmenttyoeB on
#include <iostream>
#define MAX_size 100 //简单的文本替换
int a=MAX_size;
#define max 200
#define to_string(x) #x //转成字符串
#define link(a,b) a##b //连接字符串
#define pr(...) printf(__VA_ARGS__);//__VA_ARGS__表示前面的参数
#define prl(...) printf(__VA_ARGS__);putchar('\n');
#undef MAX_size //撤销前面定义的MAX_size
#define MAX_size 10 //重新定义MAX_size
int b=MAX_size;
#define add(a,b) \
(((a)+(b)) \
+((a)*(b))) //具有多行宏定义
using namespace std;
void test();
int main() {
cout<<a<<" "<<b<<endl;
cout<<add(10,20)<<endl;//结果是230
prl("%s","123");//测试宏定义
cout << "Hello, World!" << endl;
test();
//int a[5]={1,2,3,4,5};
//printf("%d\n",2[a]);//2[a]等同于a[2];
//system("pause");//系统暂停
return 0;
}
void test(){
prl(__DATE__);//含有编译日期的字符串 如Apr 13 2022
prl(__FILE__);//当前源代码的名称, 如E:/code/cpp/projects/test/main.cpp
prl("%d",__LINE__);//当前(该宏所在行) 的行号,如29
prl(__TIME__);//编译时间 如15:32:12
prl("%d",__STDC__);//常量1,表示编译器遵循ISO C标准 如1
prl("%d",__STDC_HOSTED__);//是否宿主于操作系统 如1
//pr("%ld",__STDC_VERSION__);//编译器遵循的标准,用长整型表示,如201112
//上面一行代码在我的编译器中提示找不到__STDC__VERSION__变量,有可能是编译器的问题
}
运行结果如下:
100 10
230
123
Hello, World!
Apr 13 2022
E:/code/cpp/projects/test/main.cpp
29
14:09:31
1
1
易错点:
#define sum(a,b) (a)+(b) 应改为#define sum(a,b) ((a)+(b))
#define path D:\cpp\
test.c 等同于#define path D:\cpptest.c
不要在宏表达式内写++或者--,可能会造成一个语句内有多个++或者--,不同编译器会有不同的处理结果,尽量避免这种写法
#define fori(a,b) for(int i=(a);i<(b);++i)
#define forj(a,b) for(int j=(a);j<(b);++j)