我试图用gettext翻译我的控制台日志,但是我收到了以下错误:
program.c: In function ‘program_take_screenshot’:
program.c:55:14: error: expected ‘)’ before ‘dcgettext’
#define _(x) gettext(x)
^
program_logger.h:117:49: note: in definition of macro ‘PROGRAM_ERR’
fprintf(LOG_FILE, "Program [ERROR] :: " __VA_ARGS__); \
^
program.c:173:17: note: in expansion of macro ‘_’
PROGRAM_ERR(_("Cannot take screenshot. GPU rendering is used and read_viewport is not supported.\n"));
^
我做错了什么?
program_logger.h中的定义:
#define PROGRAM_LOG(...) do { \
if (PROGRAM_LOG_VERBOSE) \
{ \
fprintf(LOG_FILE, "Program: " __VA_ARGS__); \
fflush(LOG_FILE); \
} \
} while (0)
PROGRAM_ERR的定义:
#define PROGRAM_ERR(...) do { \
fprintf(LOG_FILE, "PROGRAM [ERROR] :: " __VA_ARGS__); \
fflush(LOG_FILE); \
} while (0)
答案 0 :(得分:1)
虽然其中一个答案解释了正在发生的事情,但它并没有为您提供解决问题的适当方法。
你有什么:
#define PROGRAM_ERR(...) do { \
fprintf(LOG_FILE, "PROGRAM [ERROR] :: " __VA_ARGS__); \
fflush(LOG_FILE); \
} while (0)
例如,允许像PROGRAM_ERR("some error: %s", "error message")
一样使用它。然而,正如您所发现的,PROGRAM_ERR(_("some error: %s"), "error message")
失败了。
正如已经解释的那样,原因确实是扩展到
do { fprintf(LOG_FILE, "PROGRAM [ERROR] :: " _("some error: %s"), "error message"); fflush(LOG_FILE); } while(0)
和字符串连接仅适用于字符串文字。
在我看来,最简单的方法就是
#define PROGRAM_ERR(...) do { \
fputs("PROGRAM [ERROR] :: ", LOG_FILE); \
fprintf(LOG_FILE, __VA_ARGS__); \
fflush(LOG_FILE); \
} while (0)
通过分离两个字符串,您不需要任何编译时字符串连接,如果在编译时不知道字符串,这根本不可能。
答案 1 :(得分:0)
尝试更改宏以将##
放在__VA_ARGS__
之前。 (##__VA_ARGS__
)指示预处理器在那里放置逗号,但仅在有参数的情况下。
有关详细信息,请参阅gcc文档here。