2016-11-04 5 views
2

Я сильно уменьшил свой реальный код, чтобы сделать его максимально компактным для этой публикации.Функция return warning about const attribute

Мои вопросы касательно атрибута 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' Классификатор от целевого указателя типа [по умолчанию включено]

код работает отлично.

somefunction не касался строки tmp, поэтому почему return сгенерировать это предупреждение?

Если я покину const, предупреждение исчезнет.

+3

Поскольку тип возврата является символом 'char *', а не 'const char *'. Изменить 'char * somefunction (char * c)' to 'const char * somefunction (char * c)' –

+0

Работал ... большое спасибо! – geohei

ответ

2

Когда вы отмечаете что-то как const, вы говорите компилятору, что не собираетесь его изменять.

Вы принимаете const char * и возвращаете его как char *. Это нарушает обещание const, которое вы даете tmp. Код, который вызывает эту функцию, может свободно изменять то, что он возвращает, потому что он не возвращает указатель const.

Изменение somefunction для возврата const char *:

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

Не думал, что далеко (новичок в C ... извините) ...! Спасибо! – geohei

1

Как вы возвращаете указатель вы даете возможность «редактировать» данные для вызывающей функции. Это находится в противоречии с тем, что вы сделали перед:

extern const char tmp[]; 

это объявление указателя на то, что должно оставаться неизменным, а именно для редактирования. Компилятор просто предупреждает вас об этом противоречии.