(v) на самом деле (* & v), так как когда?
Могут ли гуру стандартов на С++ просветить меня:
С какой стандартной версией С++ этот оператор не сработал, потому что (v)
кажется эквивалентным (*&v)
?
т.е. например код:
#define DEC(V) ( ((V)>0)? ((V)-=1) : 0 )
...{...
register int v=1;
int r = DEC(v) ;
...}...
Теперь это вызывает предупреждения в -std=c++17
, например:
не может принимать адрес переменной регистра
левая сторона операнда должна быть lvalue
Многие макросы C заключают в круглые скобки ВСЕ макроопределения, из которых приведенное выше означает только типичный пример.
Фактические макросы, которые вызывают предупреждения, например,
макрос RTA_*
в /usr/include/linux/rtnetlink.h
.
Если вы не используете/не переопределяете эти макросы в С++, существует ли какое-либо обходное решение?
Ответы
Ответ 1
Если вы посмотрите сводку ревизии последнего проекта С++ 1z, вы увидите это в [diff.cpp14.dcl.dcl]
[dcl.stc]
Изменить: Удаление регистра-класса-спецификатора регистров.
Обоснование: Включить повторное использование устаревшего ключевого слова в будущем изменения этого международного стандарта.
Влияние на оригинальную функцию: Действительная декларация С++ 2014 с использованием регистра Спецификатор класса хранения не соответствует требованиям настоящего стандарта. Спецификатор можно просто удалить, чтобы сохранить исходное значение.
Предупреждение может быть связано с этим.
Ответ 2
register
больше не является спецификатором класса хранения, его следует удалить. Компиляторы могут не выдавать правильную ошибку или предупреждения, но ваш код не должен иметь register
для начала с
Ниже приведена цитата из стандартного информирования людей о том, что они должны делать в отношении register
в своем коде (соответствующая часть подчеркнута), вероятно, у вас есть старая версия этого файла
C.1.6 Раздел 10: декларации [diff.dcl]
Изменить: в С++ регистр не является спецификатором класса хранения.
Обоснование: спецификатор класса хранения не повлиял на С++. Влияние на оригинальную функцию: удаление семантически четко определенной функции.
Сложность преобразования: синтаксическая трансформация.
Насколько широко используется: Common.
Ответ 3
Ваше беспокойство необоснованно, так как данный файл не содержит ключевое слово register
:
grep "register" /usr/include/linux/rtnetlink.h
ничего не выводит. В любом случае вы не должны получать предупреждение, так как:
-
Заголовки систем не выдают предупреждения по умолчанию, по крайней мере в GCC
-
Нецелесообразно пытаться скомпилировать файл, относящийся к системному проекту, например, к ядру linux в режиме С++, поскольку могут быть тонкие и неприятные нарушения.
Просто включите файл как правило или свяжите код C с вашим двоичным файлом С++. Сообщите об ошибке, если вы действительно получаете предупреждение, которое обычно должно быть подавлено поставщику компилятора.