我有一个C函数,用于格式化具有以下签名的字符串:

int
string_format
(   char*       dst
,   const char* fmt
,   ...
);

我通常这样称呼它:

char buf[20];
const char* name = "Jeff";
string_format ( buf , "Hello %s!\n" , name );

我现在try 使用ANSI colored颜色 代码处理彩色文本.理想情况下,我想在字符串字面量中使用它们,如下所示:

char buf[20];
const char* name = "Jeff";
string_format ( buf , COLOR_RED "Hello %s!\n" , name );

我编写了一些宏来构建这些字符串文字,但我做错了一些事情.例如,我try 过:

#define ANSI_CC(color) "\033["#color"m"
#define ANSI_CC_FG_RED "91"

#define COLOR_RED (ANSI_CC(ANSI_CC_FG_RED))

但是,当我try 呼叫string_format (buf, COLOR_RED "Hello world.\n"")时,我得到了一个编译器错误:

error: expected ')' before string constant
    |     COLOR_RED "Hello world.\n"
                    ^~~~~~~~~~~~~~~~

我的 idea 是,预处理器将COLOR_RED的计算结果归结为:

COLOR_RED                 =>
(ANSI_CC(ANSI_CC_FG_RED)) =>
"\033["ANSI_CC_FG_RED"m"  =>
"\033[""91""m"

但显然它在做其他事情,我不明白;我怀疑我错误地使用了#字符串化操作符.有人能解释一下预处理器是怎么处理我写的宏的吗?另外,如果我想要实现的目标是可能的,我需要改变什么?

谢谢.

推荐答案

您的宏将扩展为:

string_format ( buf , ("\033[""ANSI_CC_FG_RED""m") "Hello %s!\n" , name );

您需要将宏更改为:

#define ANSI_CC(color) "\033[" color "m"
#define ANSI_CC_FG_RED "91"

#define COLOR_RED ANSI_CC(ANSI_CC_FG_RED)

并将扩大到:

string_format ( buf , "\033[" "91" "m" "Hello %s!\n" , name );

https://godbolt.org/z/3oGzhhbYx

C++相关问答推荐

如何在C中的空指针函数中传递浮点值

__VA_OPT__(,)是否可以检测后面没有任何内容的尾随逗号?

为什么双重打印与C中的float具有不同的大小时具有相同的值?

如何在C中从函数返回指向数组的指针?

ESP32在vTaskDelay上崩溃

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

Char变量如何在不使用方括号或花括号的情况下存储字符串,以及它如何迭代到下一个字符?

C-使用指针返回修改后的整数数组

如何使用[BTStack]BLE发送大型(>;2kb)信息包

CC2538裸机项目编译但不起作用

当b是无符号字符时,int a=(b<;<;2)>;>;2;和int a=b&;0x3F;之间有什么区别?

可变宏不能编译

C";中的ANN运行时判断失败#2-变量outputLayer;周围的堆栈已损坏.运行后出错

如何修复我的qsort()算法?它每次都给出不同的结果

为什么我的半数组测试和奇数组测试不起作用?(我使用Assert进行调试)

被调用方函数内部的C-Struct变量,它是指针还是无关紧要

&stdbool.h&q;在嵌入式系统中的使用

意外的C并集结果

Clang 是否为内联汇编生成了错误的代码?

运行以下 C 程序时出现分段错误