Проблемы с наследованием на основе ifdef в C ++ - PullRequest
1 голос
/ 04 октября 2011

Я просматривал код какого-то класса, который использовал, и наткнулся на такой код:

#ifdef SOME_OBSCURE_CONDITION
class A {
#elif 
class A : public B {
#endif

Могут ли быть проблемы с таким кодом?

В частности, предположим, что файл x.cpp содержит y.h и z.h. z.h и y.h включают a.h (который определяет класс A), но дополнительно y.h определяет SOME_OBSCURE_CONDITION. В этом случае два x противоречивых определения A не будут присутствовать в x.cpp?

Ответы [ 5 ]

3 голосов
/ 04 октября 2011

да, два варианта одновременно будут нарушать ODR (одно правило определения) и могут привести к чему-либо в диапазоне от

  • ошибки компиляции
  • ошибки ссылки
  • неопределенное поведение (включая, но не ограничиваясь сбоем)

Пока вы можете быть уверены, что определение SOME_OBSCURE_CONDITION является глобально идентичным (также для частичных сборок / перекомпоновок ...), проблем не будет.

2 голосов
/ 04 октября 2011

Если кто-то использует такую ​​конструкцию кода, то ответственность за правильную обработку макроса лежит на пользователях.
Можете ли вы сломать его?
Да, C ++ позволяет вам выстрелить себе в ногу, это довам не делать этого.

0 голосов
/ 04 октября 2011

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

0 голосов
/ 04 октября 2011

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

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

0 голосов
/ 04 октября 2011

Невозможно ответить в общем случае. Я уверен, что вы могли бы найти способы сломать это, но это верно почти во всем.

...