带有字符串变量的彩色读取行的字符串文字组合

string literal combination for colorized readline with string variable

是否可以将变量 text_info 放入带颜色的 readline 中?
GCC 调试器给我这个错误:" error: expected ‘)’ before 'text'

#include <readline/readline.h>

#define CYELLOW "[=10=]1\e[0;31m[=10=]2"
#define RESET   "[=10=]1\e[0m[=10=]2"

int main(int argc, char **argv)
{
    char *text_info = "its very simple string";
    readline(CYELLOW text_info RESET);
    return 0;
}

我知道下面的方法可行,但事实并非如此。

int main(int argc, char **argv)
{
    readline(CYELLOW "simple string" RESET);
    return 0;
}

您发布的行不起作用,因为它在构建期间无法合并:

readline(CYELLOW text_info RESET);

正如@Weaterh Vane 在上面的评论中已经提到的那样,唯一真正的解决方案是在运行时通过 sprintf 或更好的 snprintf.

构建字符串
 char aBuffer[100];
 snprintf(aBuffer, sizeof(aBuffer), "%s%s%s", CYELLOW, text_info, RESET);

编辑: 请记住,上面例子中的 aBuffer 可能太小了(取决于 text_info 的长度)。根据您的应用程序,您可以增加 100 的大小或动态分配缓冲区。

在工作代码中,这一行

readline(CYELLOW text_info RESET);

宏扩展为

readline("[=11=]1\e[0;31m[=11=]2" "simple string" "[=11=]1\e[0m[=11=]2");

反过来,在字符串文字组合结束后为

readline("[=12=]1\e[0;31m[=12=]2simple string[=12=]1\e[0m[=12=]2");

其中包含一个简单的字符串文字。不涉及运算符,但它仍然作为函数的单个参数结束。

与此相反,这一行

readline(CYELLOW text_info RESET);

宏扩展为

readline("[=14=]1\e[0;31m[=14=]2" text_info "[=14=]1\e[0m[=14=]2");

不受字符串文字组合的影响,因此以三个字符串表达式(即不完全是文字字符串,一个是非文字字符串,一个指向字符的指针)结束,中间没有任何运算符。

此外,没有用于字符串连接的简单运算符(字符串文字组合之外的情况)。

因此,为了给出单个字符串参数("string",如“C 兼容的零终止字符序列,可能是数组”),您将必须构造这样一个字符串,然后将其用作函数的单个参数。

正如 Weather Vane 所建议的那样,sprintf() 可能是执行此操作的工具。