2016-11-04 3 views
2

私は実際のコードを大幅に減らして、この投稿に対して可能な限りコンパクトにしました。const属性に関する関数の復帰に関する警告

私の質問はconst属性に関するものです。私はこれをコンパイルすると...

const char tmp[] = "anything"; 

int main(int argc, char *argv[]) { 
    /* my code */ 
    return 0; 
} 

char *somefunction (char *c) { 
    extern const char tmp[]; 
    /* my code */ 
    return tmp; 
} 

は...私が取得:

警告:ポインタのターゲット・タイプからの戻り破棄 'のconst' 修飾子[デフォルトで有効になって]

コードは正常に動作します。

は文字列tmpに触れなかったので、returnはなぜこの警告を生成しますか?

私がconstのままにすると、警告が消えます。

+3

戻り値の型は 'char *'であり、 'const char *'ではないためです。 'char * somefunction(char * c)'を 'const char * somefunction(char * c)'に変更してください –

+0

多くの感謝! – geohei

答えて

2

何かをconstとマークすると、あなたはそれを修正するつもりはないと言います。

あなたはconst char *を受け取り、それをchar *として返しています。それはtmpに与えているconstの約束を破ります。この関数を呼び出すコードは、constポインタを返さないため、返される内容を自由に変更できます。

変更somefunctionは戻りconst char *

const char *somefunction (char *c) { 
    ... 
+0

それは遠いと思っていませんでした(Cの初心者は...申し訳ありません)...! ありがとう! – geohei

1

あなたは関数の呼び出し元にデータを「編集」する可能性を与えているポインタを返すされています。これは、あなたが右の前にやっていることと矛盾している:

、すなわち非編集可能な一定のままでなければならない何かへのポインタの宣言だ
extern const char tmp[]; 

。 コンパイラはこの矛盾について警告しています。

関連する問題