尝试在C语言中使用宏为文本着色,但得到:错误:预期为')'

时间:2019-03-06 16:36:21

标签: c compiler-errors

我正在为将来的项目用C编写基于宏的终端字符串着色器。到目前为止,我所得到的只是这个:

#define ANSI_RED     "\x1b[31m"
#define ANSI_GREEN   "\x1b[32m"
#define ANSI_YELLOW  "\x1b[33m"
#define ANSI_BLUE    "\x1b[34m"
#define ANSI_MAGENTA "\x1b[35m"
#define ANSI_CYAN    "\x1b[36m"
#define ANSI_RESET   "\x1b[0m"

#define ANSI_COLOR(color, string) color string ANSI_RESET

#define FOREGROUND 38
#define BACKGROUND 48

#define RGB_COLOR(plane, r, g, b, string) "\033[" plane ";" r ";" g ";" b "m" string ANSI_RESET

ANSI_COLOR宏工作正常,但是当我尝试使用RGB_COLOR时,就像这样:

printf( RGB_COLOR(FOREGROUND, 248, 42, 148, "Starting the server:\n") );

我得到一个错误:

/c-http-server/main.c:17:23: error: expected ')'
    printf( RGB_COLOR(FOREGROUND, 248, 42, 148, "Starting the server:\n") );
                      ^
/c-http-server/libs/c-chalk/chalk.h:11:20: note: expanded from macro 'FOREGROUND'
#define FOREGROUND 38
                   ^
/c-http-server/main.c:17:11: note: to match this '('
    printf( RGB_COLOR(FOREGROUND, 248, 42, 148, "Starting the server:\n") );

我已经在SO上寻找了这个问题,并且大多数解决方案都是关于找到额外的')',但是我在我的代码中找不到一个。

如果有人可以帮助我找到问题,我会很高兴,也许我只是盲目的而错过了一些明显的事情。

2 个答案:

答案 0 :(得分:2)

好像您正在尝试将不可能的字符串和整数连接起来。

作为快速解决方案,您可以尝试

#define FOREGROUND "38"
#define BACKGROUND "48"

并像使用它

printf( RGB_COLOR(FOREGROUND, "248", "42", "148", "Starting the server:\n") );

另一方面,应该(而且更干净)stringize参数(未经测试):

#define xstr(a) str(a)
#define str(a) #a
#define RGB_COLOR(plane, r, g, b, string) "\033[" str(plane) ";" str(r) ";" str(g) ";" str(b) "m" string ANSI_RESET

请注意通过xstrstr绕行,因为当@John Bollinger正确注释时,字符串化会阻止宏扩展。

答案 1 :(得分:0)

连接字符串时,您可以像"aa" "bb"那样进行操作,结果就像编写"aabb"一样。

因此,当您调用printf(arguments)时,它可以写

printf("str1" "str 2")

但是如果您要调用将字符串参数与数字结合起来的printf,则必须在参数之间加上逗号

printf("aa" "bb", 100)

否则,解释器会认为您到达了最后一个参数-在类似情况下

printf("aa" "bb" 100)

它将认为您应该在100之前关闭括号。

根据您的情况,您尝试致电

printf(RGB_COLOR(38,248,42,148,“正在启动服务器:\ n”));

被重写为

printf(  "\033[" "Starting the server:\n"  ";" 248 ...... )

这是

printf(  "\033[Starting the server:\n;"  248 ...... )
                                       ^->HERE EXPECTS COMMA