В eclipse переопределение макросов следует рассматривать как ошибку, а не как предупреждение - PullRequest
1 голос
/ 08 января 2020

C ++

Я знаю, что некоторые / большинство скажут обрабатывать все предупреждения как ошибки, но с базой кода, с которой я работаю, в настоящее время это невозможно. У меня есть два заголовочных файла, сгенерированных внешним инструментом, содержащим адреса некоторого оборудования, к которому мне нужно получить доступ. например,

header1.h

#define address1 0x123

header2.h

#define address1 0x123

Вышеуказанная ситуация не идеальна, но хорошо, препроцессор не будет генерировать предупреждение в этом случае. Однако, если бы второй макрос def был другим, я бы хотел, чтобы он отмечал ошибку, а не предупреждение. В Eclipse, если бы я изменил второе определение address1 на другое, я получу предупреждение вроде:

'address 1 redefined [включено по умолчанию]'

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

1 Ответ

2 голосов
/ 08 января 2020

Если один заголовок определяет адрес как 0x123, а другой - 0x234, то, если оба заголовка включены в одну единицу перевода, вы получите переопределенное предупреждение или ошибку макроса. (Я кодирую с помощью G CC s -Werror, так что это определенно будет для меня ошибкой - он преобразует все предупреждения в ошибки и, на мой взгляд, хороший дисциплинар; вам нужен код без предупреждений, чтобы получить его нужно скомпилировать вообще.) Если предупреждение включено по умолчанию, вы можете преобразовать его в ошибку с помощью -Werror, но вы не получите избирательность -Werror=missing-prototypes или чего-либо еще.

Если вы необходимо сохранить значения в syn c, определить адрес в одном заголовке (например, header1.h), а другой (header2.h) включить первый. Это можно рассматривать как применение принципа DRY (не повторяйте себя), или ODR (одно правило определения - хотя это больше для внешних символов, чем макроопределений), или различных других имен.

В противном случае, в каком-то модуле, включите оба заголовка, чтобы все не сработало, если вы ошиблись (значения разные). Заголовки обеспечивают перекрестную проверку в вашей системе сборки и имеют решающее значение.

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