2017-02-15 2 views
0

Надеюсь, вы в порядке. У меня есть файл version.h, содержащийся в 5 файлах.c. Когда я компилирую У меня есть 5 предупреждений:Как избежать многократного предупреждения от gcc, когда я использую предварительную обработку # Предупреждение в .h

version.h: 10: 2: предупреждение: - SUB_VERSION2
version.h: 10: 2: предупреждение: - SUB_VERSION2
version.h: 10 : 2: предупреждение: - SUB_VERSION2
version.h: 10: 2: предупреждение: - SUB_VERSION2
version.h: 10: 2: предупреждение: - SUB_VERSION2

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

Вот мой .h и мой .c случайна:

#ifndef _VERSION_H 
#define _VERSION_H 

#define SUB_VERSION 1 
#define SUB_VERSION SUB_VERSION2 

#if (SUB_VERSION == SUB_VERSION2) 
    #ifndef WARNING_SUB_VERSION 
    #define WARNING_SUB_VERSION 
    #warning -- SUB_VERSION2 
    #endif 

#endif 
    #endif 
    #endif 

ответ

3

Вы не можете. Логически каждый файл .c скомпилирован независимо от других. Это означает, что вы не можете выпустить предупреждение из файла заголовка, включенного в один, и запретить его в других.

+0

Ваш диагноз, безусловно, кажется правильным, но вывод «вы не можете» должен опираться на некоторые неустановленные предположения о том, какие решения следует учитывать. –

+0

благодарит вас за обратную связь. У вас есть какие-либо советы по решению моей проблемы? – ruxob

+0

Мое предположение заключалось в том, что ОП не хотел менять сценарий из нескольких файлов .c, каждый из которых содержит тот же файл .h. Если OP готов изменить это (как и в вашем ответе), все изменится. Тем не менее, я чувствую, что OP ищет какую-то магию препроцессора. Если так: «вы не можете». –

0

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

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

Существуют другие возможности, связанные со структурой вашего кода, такие как использование макросов и дополнительных условий препроцессора для обозначения конкретной единицы перевода - возможно, содержащей main() - как тот, для которого выдается предупреждение. Однако такие подходы являются хрупкими, и я не рекомендую их также.

Ваши лучшие варианты, вероятно, либо живут с несколькими предупреждениями, либо полностью подавляют их.