2017-08-22 92 views
2

在Debian中8的源代碼/source/procps-3.3.9/lib/fileutils.c線38是: 字符常量* 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 

有誰知道什麼_(" ")格式的意思嗎?

+1

'_'是一個完全合法的_name_。 –

回答

6

這是標記使用GNU gettext,一個免費的軟件翻譯工具翻譯字符串的標準方式。

The _() macro由外部工具找到,該工具提取文本以使其可翻譯,以及(在運行時)執行查找以用必要的翻譯來替換文字。

沒有什麼特別的名字_,這只是一個很短,但非常有效的C標識符。也許有點用一個下劃線開始一個公共符號,我現在還不確定。

你得到的錯誤是因爲你的測試程序很可能不包括聲明這個宏的<libintl.h> header(當然是gettext的一部分)。因此,您會像預期的那樣得到正常的「未定義參考」錯誤。

+0

我對SO某處讀取留給鏈接器時不建議開始下劃線符號。宏雖然不是問題。 –

+0

另外,你能提供一種解決OP問題的方法嗎?爲什麼不是在這個公共和工作源代碼中定義的宏? –