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