2010-08-04 2 views
3

Почему следующая программа дает предупреждение?Зачем возникает следующая ошибка:

Note: Очевидно, что отправка нормального указателя на функцию, требующую указателя const, не дает никакого предупреждения.

#include <stdio.h> 
void sam(const char **p) { } 
int main(int argc, char **argv) 
{ 
    sam(argv); 
    return 0; 
} 

Я получаю следующее сообщение об ошибке,

In function `int main(int, char **)': 
passing `char **' as argument 1 of `sam(const char **)' 
adds cv-quals without intervening `const' 
+1

Ваш компилятор сообщает об ошибке или предупреждении? (и, если он сообщает только предупреждение, какой компилятор вы используете? Он _should_ сообщает об ошибке) –

+0

@James: Мой компилятор [gcc version 2.95.3] выдает ошибку. Измените вопрос сразу. Спасибо за уведомление. – joshu

+2

@ Прабху: Ах, хорошо. Я изначально думал, что это может быть старая версия Visual C++ (_not, что я думаю, что Visual C++ не соответствует стандарту соответствия ... совсем не ... nope ..._). –

ответ

10

Этот код нарушает константный правильность.

Проблема в том, что этот код является принципиально небезопасным, потому что вы можете непреднамеренно изменить объект const. C++ FAQ Lite имеет отличный пример этого в ответ на "Why am I getting an error converting a Foo**Foo const**?"

class Foo { 
public: 
    void modify(); // make some modify to the this object 
}; 

int main() 
{ 
    const Foo x; 
    Foo* p; 
    Foo const** q = &p; // q now points to p; this is (fortunately!) an error 
    *q = &x;    // p now points to x 
    p->modify();   // Ouch: modifies a const Foo!! 
    ... 
} 

(пример с ++ FAQ Lite документа Marshall Cline в C, www.parashift.com/c++-faq-lite/)

Вы можете решить эту проблему с помощью константных-квалификационных обоих уровней Направление:

void sam(char const* const* p) { } 
Смежные вопросы