C++define语句块问题

本文最后更新于:2021年4月7日 下午

C++define语句块问题

1. 错误使用方式:
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>

#define print(x, y) (std::cout << x + y << std::endl;)

int main() {
int x = 1, y = 2;
if (x == 1)
print(x, y);
else
std::cout << "error" << std::endl;
return 0;
}

why? #define print(x, y) (std::cout << x + y << std::endl;) 这条宏定义其实就是一条语句,因为本身我们也都会习惯性的会去在语句末端加上;,而此时在if语句中,我们认为只有一个语句,使用宏定义后,也会加上;,这就导致在宏定义语句后面多了一条空语句,所以else没有匹配的if而出现报错。

为此,我们会经常将上述宏定义语句较长的加上do{}while(0)来使其成为一条语句,从而更符合常规使用习惯!

2. 改正优化后的效果
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>

#define print(x, y) do { std::cout << x + y << std::endl; } while(0)

int main() {
int x = 1, y = 2;
if (x == 1)
print(x, y);
else
std::cout << "error" << std::endl;
return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!