Компилятор может и, вероятно, устранит (проигнорирует) объявление о неиспользованной переменной volatile
(но компилятор не может устранить определение неиспользуемой глобальной переменной - он должен предполагать, что какой-то другой модуль перевода (TU) будет ссылаться на него) .
Если переменная является локальной для функции и не используется, она может быть устранена компилятором независимо от его изменчивости. Не ясно, что у вас могут быть значимые локальные изменчивые переменные, хотя я полагаю, что вы могли бы вызвать функцию, которая передает свой адрес некоторому коду, который затем организует обработчик прерываний для записи в эту переменную - достигая изменчивости (но тогда, очевидно, используемая переменная).
Спецификатор volatile
управляет (влияет) тем, как компилятор генерирует код, обращающийся к переменной - если код не обращается к переменной, нет необходимости изменять код, который он генерирует, за исключением того, чтобы избежать создания ссылки на переменная. Это может также не существовать.
Дальнейшие мысли:
Если переменная static volatile
и на нее нет ссылок в исходном коде, ее можно удалить?
Ответ (почти наверняка) да. В источнике нет ссылки на переменную, и единственные способы, к которым она может быть доступна в портативном виде, требуют ссылки на нее. Возможные непереносимые хаки будут включать определение нескольких таких статических переменных и передачу ссылки на одну из них какой-либо функции, и эта функция затем сможет получить доступ к другим переменным путем манипулирования адресом. Однако такой код в лучшем случае ужасен и непереносим. Автор такого, вероятно, должен быть где-то вывезен и тихо отговорен от повторного написания такого кода.
Таким образом, определение глобальной переменной невозможно исключить; на него можно ссылаться из другого TU. Неиспользуемое определение статической переменной может быть исключено. Определение локальной переменной, которое не используется, может быть исключено. И это относится к тому, имеет ли рассматриваемая переменная квалификатор volatile
или нет.