我正在为将来的项目用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上寻找了这个问题,并且大多数解决方案都是关于找到额外的')',但是我在我的代码中找不到一个。
如果有人可以帮助我找到问题,我会很高兴,也许我只是盲目的而错过了一些明显的事情。
答案 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
请注意通过xstr
和str
绕行,因为当@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