【问题标题】:What does _("write error") mean?_("write error") 是什么意思?
【发布时间】:2018-01-30 09:14:45
【问题描述】:

在 Debian 8 的源代码 /source/procps-3.3.9/lib/fileutils.c 第 38 行是: char const *write_error = _("写入错误");

我对 _("write error") 部分感到困惑。谷歌在变量命名约定或库保留名称上显示了该结果,但没有关于何时 _ 位于 = 右侧和 () 引用的字符串之前。

我还将这一行放入一个最简单的测试程序中,因为只有有用的行然后编译失败说:

test.c:5:20: warning: implicit declaration of function ‘_’ [-Wimplicit-function-declaration]
    char const *str = _("test string");
                    ^

test.c:5:20: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
/tmp/cczQpqTh.o: In function `main':
test.c:(.text+0x15): undefined reference to `_'
collect2: error: ld returned 1 exit status

有人知道_(" ") 格式是什么意思吗?

【问题讨论】:

  • _ 是一个完全合法的名称

标签: c


【解决方案1】:

这是使用免费软件翻译工具GNU gettext 标记要翻译的字符串的标准方法。

The _() macro 由外部工具找到,该工具提取文本以使其可翻译,并(在运行时)进行查找以用必要的翻译替换文字。

_ 这个名字没有什么特别之处,它只是一个非常短但完全有效的 C 标识符。用下划线开始公共符号可能有点不确定,我现在不确定。

您遇到的错误是因为您的测试程序很可能无法包含声明此宏的<libintl.h> header(当然是gettext 的一部分)。因此,正如预期的那样,您会得到正常的“未定义引用”错误。

【讨论】:

  • 我在 SO 上的某处读到,不建议将以下划线开头的符号留给链接器。不过宏不是问题。
  • 另外,你能提供一种解决 OP 问题的方法吗?为什么这个公共和工作源代码中没有定义宏?
猜你喜欢
  • 1970-01-01
  • 2020-05-03
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2013-10-10
相关资源
最近更新 更多