欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

宏定义#define的使用

程序员文章站 2024-03-22 10:29:22
...

1.#

假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串。
例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化(stringizing)。

#include <iostream>
#define SQUARE(x) printf("square of " #x " is %d\n", (x) * (x))
using namespace std;

int main()
{
    int y = 4;
    SQUARE(4); // square of 4 is 16
    SQUARE(2+4); // square of 2+4 is 36
}

第一次调用宏时使用“y”代替#x;第二次调用时用“2+4"代#x。

2.##

##还可以用于类对象宏的替换部分。
这个运算符把两个语言符号组合成单个语言符号。

#include <stdio.h>

#define XN(n) x##n
#define PXN(n) printf("x" #n " = %d\n", x##n)

using namespace std;

int main()
{
    int XN(1) = 10; //x1
    PXN(1); //print("x1 = %d\n", x1);
}

输出结果:
x1=10

3./

4.#ifdef

如果F1之前define过了,就走#ifdef和#else之间,
如果没define过,就走#else和#endif之间

#include <iostream>
#define F1 1

#ifdef F1
#define F2 1
#else
#define F2 2
#endif
using namespace std;
int main()
{
    cout << F2; //输出1
}

5.VA_ARGS 可变宏参数

#include <iostream>
#define DEBUG(...) printf(__VA_ARGS__)
#define ERROR(fmt, ...) printf(fmt, __VA_ARGS__)

using namespace std;

int main()
{
    int y = 99;
    //宏展开: printf("%d\n", y)
    DEBUG("%d\n", y);
    //宏展开: printf("%d,%d,%d\n", y, 1, 2)
    DEBUG("%d,%d,%d\n", y, 1, 2);

    ERROR("%d\n", y);

    ERROR("%d,%d,%f\n", 1, 2, 3.0);
}
相关标签: C++基础