gpt4 book ai didi

c - 如何在 c 中将 gettext 与 __VA_ARGS__ 一起使用

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:52 24 4
gpt4 key购买 nike

我试图用 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)

最佳答案

虽然其他答案之一解释了正在发生的事情,但它并没有为您提供解决问题的适当方法。

你有什么:

#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)

通过分隔两个字符串,您不需要任何编译时字符串连接,如果字符串在编译时未知,这根本不可能。

关于c - 如何在 c 中将 gettext 与 __VA_ARGS__ 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22820836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com