Прогнозировать порядок компиляции модулей, чтобы избежать переопределения

Предположим, у нас есть проблема переопределения с windows.h и winsock2.h .

Я знаю, как это решить. Чтобы быть на 100% уверенным, просто добавьте строку _WINSOCKAPI_ в определение препроцессора. Или определите #define _WINSOCKAPI_ перед каждым включением windows.h. Но я хотел бы пойти более тонким путем и определить _WINSOCKAPI_ непосредственно перед первым включением windows.h. Как узнать порядок компиляции юнитов, чтобы разместить #define _WINSOCKAPI_ в нужном месте?

Пожалуйста, поправьте меня, если я неправильно понимаю проблему переопределения.


person vico    schedule 27.11.2015    source источник
comment
Эээ.. Я не думаю, что вы можете предсказать это последовательно. И даже если бы вы могли для конкретного компилятора, он наверняка не был бы переносимым. Используйте директиву препроцессора. Вот для чего они.   -  person Baldrick    schedule 27.11.2015


Ответы (1)


Я не думаю, что вы можете предсказать порядок компиляции. Я не читал стандартов на этот счет, но я думаю, что одним из предпосылок компиляции c-кода является то, что каждый исходный файл может быть скомпилирован независимо. Это позволяет выполнять параллельные сборки и т. д.

Поэтому я бы не стал полагаться на то, что ваши файлы c/cpp компилируются в определенном порядке.

Однако порядок обработки включенных файлов предсказуем; это порядок, в котором они включены в файл c/cpp.

Лично я бы включил winsock2.h перед windows.h в качестве решения этой проблемы, а не определял _WINSOCKAPI_, но определение его как определения препроцессора — интересная идея.

person Erik    schedule 27.11.2015