2012-01-24 93 views
2

在我的庫中,我必須返回一個字符串給調用者。我返回的字符串將是一個全局數組,調用者的預期用途是讀取字符串。我不想讓他們修改它..從C函數返回const char * *

這是聲明函數的正確方法..

const char * get_some_details(); 

這應該產生一個警告(只試過GCC)既可以當主叫用戶分配收益值賦給char * ptr或賦值給const char * ptr,但稍後嘗試修改它。

我問,因爲我希望喜歡的getenv()函數返回爲const char *。但它返回char *。返回const char *有沒有問題?

+0

getenv返回char *,因爲返回的緩衝區指針不是常量。它包含了你的結果字符串調用getenv之後,但未來調用GETENV,SETENV是可以改變的是相同的緩衝器,或unsetenv – TJD

+0

所以GETENV以下使用()是不正確的名稱= GETENV(「NAME」)?; ID = GETENV( 「ID」);使用名稱和編號。第二次調用getenv()可以覆蓋任何名稱指向之前 – Manohar

回答

5

返回const char*正是在這種情況下做正確的事。

許多舊的API不使用const,因爲它們在C90中引入了const之前(此前沒有const)。

+0

感謝您的快速響應 – Manohar

+0

請注意,此原理不適用於getenv在原始帖子中的示例。 GETENV需要一個const char *與返回一個char * http://pubs.opengroup.org/onlinepubs/009604499/functions/getenv.html – TJD

2

這是做正確的方式。

由於歷史原因,許多標準庫函數在邏輯上應該返回char *,因爲歷史原因:C89之前,沒有const;後C89,他們的類型簽名不能改變而不破壞應用程序代碼。作爲一般規則,不是使用標準庫作爲風格指南;它很古老,包含許多不再被認爲是好的做法。 (咳嗽gets

+0

感謝快速反應 – Manohar

+0

幸運的是,'gets'在C11去除。 –

相關問題