hello ,你好呀,我是小二。

编码 过程中,小二发现一种神奇的用法:打印时,直接使用宏定义!

于是小二决定自己尝试一把。

1 基础环境

使用的在线编译器是这个????????????:​​Coliru (stacked-crooked.com)​

在线编译器,使用的 C++ ,默认编译选项是这个样子:

g++ -std=c++20 -O2 -Wall -pedantic -pthread main.cpp && ./a.out

然后又在本地,使用 VSCode 做了测试,编译选项是这个样子:

gcc 'main.c' -o 'main.exe' -Wall -O2 -m64 -lm -static-libgcc -std=c11 -fexec-charset=GBK ; if ($?) { &'./main.exe' }

本地 VSCode 搭建 C/C++ 编译环境,可以参考这篇文章????:​​简要记录丨VSCode 搭建基础 C/C++ 编译环境​

2 ONE

本次测试,使用的 C++ 语言,在线编译运行。

测试 Demo 如下:

#include <iostream>
#include <string>
#include <vector>

#define HELLO "Hello world"

template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec)
{
for (auto& el : vec)
{
os << el << ' ';
}
return os;
}

int main()
{
std::vector<std::string> vec = {
"Hello", "from", "GCC", __VERSION__, "!"
};
std::cout << vec << std::endl;

printf("zhaochen "HELLO" \n");
}

运行结果如下,可以看到,仅仅是有警告,但还是运行出结果了。

main.cpp:24:12: warning: invalid suffix on literal; C++11 requires a space between literal and string macro [-Wliteral-suffix]
24 | printf("zhaochen "HELLO" \n");
| ^
Hello from GCC 11.2.0 !
zhaochen Hello world

再次查看报警信息,小二理解大概意思就是,C++11 要求宏定义与文字字符串之间,必须要有一个空格

warning: invalid suffix on literal; C++11 requires a space between literal and string macro [-Wliteral-suffix]

第一次运行结果,截图如下:

C/C++ 语言 printf 可以直接使用宏定义打印?_c语言

3 TWO

基于第一次测试结果,同样使用 C++ ,在线编译。

本次测试 demo ,修复之前的警告,加上一个空格,再试试看

#include <iostream>
#include <string>
#include <vector>

#define HELLO "Hello world"

template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec)
{
for (auto& el : vec)
{
os << el << ' ';
}
return os;
}

int main()
{
std::vector<std::string> vec = {
"Hello", "from", "GCC", __VERSION__, "!"
};
std::cout << vec << std::endl;

printf("zhaochen " HELLO" \n");
}

哇偶????,运行结果不出所料,成功了,本次运行,也没有告警信息!

Hello from GCC 11.2.0 ! 
zhaochen Hello world

来看看测试的截图:

C/C++ 语言 printf 可以直接使用宏定义打印?_#include_02

4 THREE

第三次,小二决定在自己的电脑上,使用 VSCode + C 语言,本地测试,测试代码如下:

#include <stdio.h>

#define TEST_ZHAOCHEN "编码小二"

int main()
{
printf("start print...\n");
printf("my name is "TEST_ZHAOCHEN"\n");
printf("end print...\n");
}

运行结果如下:

PS E:\22-Programming\11-VsCodeC\1-test\01-2021.09.01-printf宏定义打印> gcc 'main.c' -o 'main.exe' -Wall -O2 -m64 -lm -static-libgcc -std=c11 -fexec-charset=GBK ; if ($?) { &'./main.exe' }
start print...
my name is 编码小二
end print...
PS E:\22-Programming\11-VsCodeC\1-test\01-2021.09.01-printf宏定义打印>

测试截图如下:

C/C++ 语言 printf 可以直接使用宏定义打印?_c语言_03

5 总结

到这里,小二进行了三次不同的尝试,有必要做一下总结。

1、C++11 对使用宏定义的打印,要求文本字符串与宏定义之间必须要有一个空格。

2、使用 C 语言(C11),可以直接打印出来,而不会产生警告。

小二思考了一下,这样使用的好处:

1、方便替换名字或者打印的信息。通过宏定义修改一次,即可全局修改。

2、相当于可以动态修改,如果写入固定数值,那就写死了。