Аргумент типа "volatile char *" несовместим с параметром типа "const char *" - PullRequest
4 голосов
/ 11 августа 2010

У меня есть функция, прототип которой выглядит следующим образом:

void foo(const char * data);

В другом месте моего кода у меня есть глобальная переменная, объявленная следующим образом:

volatile char var[100];

Всякий раз, когда я пытаюсь это сделать:

foo(var);

Компилятор выдает следующее сообщение об ошибке:

Аргумент типа "volatile char *" несовместим с параметром типа "const char *"

Почему это так?Насколько я понимаю, переменная в моей функции не может изменять указатель или его содержимое.Я понимаю, что, поскольку моя глобальная переменная является изменчивой, она может измениться в любое время, но, поскольку вполне допустимо иметь переменную переменную const, я не понимаю, почему я получаю эту ошибку компилятора.

Спасибо

- Амр

Ответы [ 3 ]

8 голосов
/ 11 августа 2010

Это потому, что неявные преобразования могут добавлять квалификаторы к цели типов указателей, но не удалять их.Поэтому, если вы хотите, чтобы ваша функция могла принимать volatile и / или const квалифицированные указатели, вы должны объявить это с помощью:

void foo(const volatile char * data);
6 голосов
/ 11 августа 2010

Поскольку доступ к энергозависимой переменной с использованием указателя на энергонезависимый является неправильным. Либо объект является энергозависимым, и к нему следует обращаться как к таковому везде, или вы можете получить к нему доступ как к энергонезависимому, и тогда он не должен быть помечен как таковой. Решайся.

3 голосов
/ 11 августа 2010

Если вы хотите обработать аргумент volatile в своей функции, вы должны объявить его так:

void foo(const volatile char * data);

Это бы сработало. Но имейте в виду, что это также приносит вам все накладные расходы volatile на реализацию foo, т. Е. data[something] будет перезагружаться из памяти в любой момент, когда вы к ней обращаетесь.

(Обычно volatile не очень хорошая идея, если вы не используете драйверы устройств или около того. Даже для параллельной обработки с потоками это обычно не гарантирует того, что вы ожидаете на первом сайте.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...