2016-06-01 2 views
0

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

Скажем, у меня есть 2 проекта на С ++; projA и projB. В exmpl.h файла в projA, есть это условие:

class myClass 
{ 
... 
#ifdef MYVAR 
virtual ~myClass() {} 
#endif 
} 

Я определяю MYVAR как настройки проекта и скомпилировать projA для создания projA.a статической библиотеки.

Теперь, из projB, мне нужно использовать exmpl.h projA. Просто я включаю его и компилирую projB, используя статическую библиотеку projA.a.

Однако представьте, что в projB я сделал не определеноMYVAR.

  • Что произойдет в этом случае? Прописывает ли projB код в пределах #ifdef, но использует статическую библиотеку, которая была скомпилирована с кодом в пределах #ifdef?

  • Итак, это ошибка и может вызвать неожиданное поведение?

  • Нужно ли определять все препроцессоры, которые были использованы в подпроектах, также во всех проектах, которые их используют?

Спасибо.

+2

О, мой. Просто не делай этого. Похож на серьезную проблему XY. –

+1

Один вопрос на вопрос пожалуйста. –

ответ

2

Определения myClass, используемые в обоих проектах, должны быть одинаковыми, в противном случае это является нарушением One Definition Rule, что вызывает неопределенное поведение, не требуется диагностика (то есть компилятор не обязан сообщать вам о нарушении).

Итак, да, вы должны определить MYVAR в projB, а также другие определения, влияющие на определения, используемые в обоих проектах.

Это относится, конечно, только к объектам ODR, используемым в обоих проектах.

+0

Каков правильный способ, когда вы хотите распространять projA? Просто скажите пользователям, что они должны определить? Или есть другая практика? –

+0

@MertMertce, если вы распространяете в двоичной форме, у вас не должно быть таких имен. Если вы распространяете в исходной форме, вы можете добавить файл config.h, где эти макросы определены, и требуют, чтобы пользователи # включали его в свой код. –

Смежные вопросы