Подтвердить что ты не робот

(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.

Если вы не используете/не переопределяете эти макросы в С++, существует ли какое-либо обходное решение?

4b9b3361

Ответ 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 с вашим двоичным файлом С++. Сообщите об ошибке, если вы действительно получаете предупреждение, которое обычно должно быть подавлено поставщику компилятора.