C语言宏定义

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)
posted @ 2022-04-13 18:06  俊波  阅读(198)  评论(0)    收藏  举报