2013-05-02 58 views
1

所以,我試圖創建一個很好可讀的C函數原型,它返回給我一個字符串數組(即char*)。我可以想出最接近的是一樣的東西:原型C函數返回字符串數組

const char * const *entrypoints() 
{ 
    static const char* arrays[] = {"test123", "test2"}; 
    return arrays; 
} 
然而

,我沒有在聲明中希望兩個* S,它看起來嚇人:) ...但我沒有找到一個方法來強調函數返回一個字符串數組的事實...在函數聲明中使用[]會導致有趣的編譯錯誤(例如'入口點'聲明爲返回數組const char* (entrypoints() [])的數組或在'['代幣爲const char[]* entrypoints()const char*[] entrypoints() ...是的,編譯器在這兩種情況下都是正確的),谷歌似乎沒有回答這個...所以我在這裏。

有沒有辦法在一個很好的可讀的方式聲明函數原型(這將大大公共API中),將返回C字符串數組。不是C++。 C。如果沒有,我將不得不堅持兩顆星的方法...即。 char **。並不是說這是一個(模糊)尷尬的東西,但我想強調該函數返回一個字符串數組。如字符串:)

+1

你不能在C(返回數組類型*「該函數聲明不得指定返回類型,它是一個功能類型或數組類型「*),所以它絕對是雙星時間。 – Jon 2013-05-02 12:15:58

+1

您如何期望調用者知道陣列中有多少個字符串?你需要一個哨兵或計數。 – unwind 2013-05-02 12:17:40

+0

@unwind偉大的問題!我想我必須考慮它......哨兵感覺更友好:) – fritzone 2013-05-02 12:21:02

回答

2

C I不喜歡這兩個* S IN聲明

我爲你感到遺憾,但是這就是你如何申報「返回類型數組的指針」。數組衰減爲指向其第一個元素的指針,所以這個聲明是您完成所需內容的唯一方法。

你可以做的,而不是一個返回指向字符串數組

const char *(*fn())[2] 
{ 
    static const char *arr[2] = { 
     "foo", 
     "bar" 
    }; 
    return &arr; 
} 
+0

你能詳細說明'static'關鍵字在這裏的作用嗎?我只知道它在函數調用之間保持一個變量的值,如果在變量之前使用的話。它在這裏做什麼?如果沒有麻煩,告訴我究竟是什麼'const'限定符在這裏執行。 – 2013-05-02 12:28:17

+0

問題是我真的不知道該數組有多少個元素,正如上面通過@unwind指出的那樣,我需要一個sentinel元素,指示最後一個元素。 – fritzone 2013-05-02 12:29:21

+0

@Rüppell'sVulture'static'避免UB(如果數組是自動的而不是靜態的,則不能返回它)。 'const'用於指定字符串的字符是隻讀的(這是因爲我們在這裏有字符串*文字)。 – 2013-05-02 12:29:59