如何在c中使用__VA_ARGS__的gettext

时间:2014-04-02 19:11:29

标签: c gettext

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

2 个答案:

答案 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