Считается ли «make install» вредным? - PullRequest
4 голосов
/ 31 октября 2011

Согласно этому сообщению Google C ++ Testing Framework считает "делать установку" плохой практикой.

http://groups.google.com/group/googletestframework/browse_thread/thread/668eff1cebf5309d

Причина этого в том, что эта библиотека нарушает "Правило одного определения"".

http://en.wikipedia.org/wiki/One_Definition_Rule

Где-то еще в теме написано:" Если вы передадите разные флаги -DGTEST_HAS_FOO = 1 разным единицам перевода, вы нарушите ODR. Или иногда людииспользуйте -D, чтобы выбрать, какую библиотеку malloc использовать (отладка или выпуск), и вам нужно использовать одну и ту же библиотеку malloc для всех плат. "

Мои вопросы:

  1. Что такоеэто именно этот проект делает не так?
  2. Что мы можем извлечь из этого?Как мы можем написать более защищенный код для предотвращения нарушения ODR?

1 Ответ

5 голосов
/ 31 октября 2011

Прямой ответ на вопрос: не пишите код, который зависит от параметров компилятора. В этом случае вся дискуссия проистекает из того факта, что код отличается в зависимости от флагов компилятора (наиболее вероятно с помощью #ifdef или других директив препроцессора). Это, в свою очередь, означает, что, хотя кодовая база одинакова, при изменении флагов компилятора обработанный код будет отличаться, и двоичный файл, скомпилированный с одним набором флагов, не будет совместим с двоичным файлом, скомпилированным с другим набором флагов.

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

...