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

Posted 编码小二的赵小二

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++ 语言 printf 可以直接使用宏定义打印?相关的知识,希望对你有一定的参考价值。

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]

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

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 

来看看测试的截图:

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宏定义打印>

测试截图如下:

5 总结

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

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

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

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

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

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


好了,小二本期的文章就到这里,一起加油✌✌✌,祝一切顺利!

以上是关于C/C++ 语言 printf 可以直接使用宏定义打印?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

C语言 va_end 宏

C语言 va_start 宏

关于三维向量加减乘除的C语言宏定义?

关于C语言宏定义输出