Возможно ли иметь исходный код, который «истекает» (становится недействительным после определенного момента)? - PullRequest
9 голосов
/ 01 сентября 2010

В настоящее время мы заняты переходом с Visual Studio 2005 на Visual Studio 2010 (с использованием неуправляемого C / C ++). Это означает, что около половины наших разработчиков уже используют Visual Studio 2010, в то время как другая половина все еще использует Visual Studio 2005. Недавно я столкнулся с ситуацией, когда определенная конструкция может быть написана аккуратно в Visual Studio 2010, но требует менее чистого исходного кода в Visual Studio 2005. Поскольку не все разработчики уже имеют Visual Studio 2010 на своем компьютере, я должен написать такой код:

#if _MSC_VER >= 1600
   // clean version of the source code
#else
   // less clean version
   // of the source code
   // requiring multiple lines of code
   // and requiring some dirty static_casts
#endif

Поскольку все разработчики перейдут на Visual Studio 2010 к концу этого года, я хочу, чтобы этот код автоматически исчезал через определенный момент. Сохранение «менее чистой версии» в исходном коде приводит к нечитаемому исходному коду в долгосрочной перспективе.

Конечно, я знаю, что код не исчезает автоматически, поэтому я на самом деле хочу автоматический звонок тревоги через определенный момент. Как то так:

#if _MSC_VER >= 1600
   // clean version of the source code
#else
   // less clean version
   // of the source code
   // requiring multiple lines of code
   // and requiring some dirty static_casts
#endif
#if compilation_date is after 1 november 2010
#   error "Remove Visual Studio 2005 compatibility code from this file"
#endif

Таким образом, если мы забудем об этом, мы автоматически получим уведомление об этом после 1 ноября 2010 года.

Этот трюк, вероятно, требует использования DATE , но, поскольку он должен обрабатываться прекомпилятором, вы не можете выполнять строковые манипуляции или использовать функции даты / времени в Си.

Я также подумал об альтернативной идее просто посылать себе письмо с задержкой, но мне было интересно, не существует ли решения, которое можно было бы встроить в исходный код.

Ответы [ 4 ]

15 голосов
/ 01 сентября 2010

В случае GNU make я бы сделал это так:

CFLAGS + = -DCURDATE = $ (дата оболочки +% Y% m% d)

Он добавит макрос CURDATE к флагам компилятора, который содержит текущее время в формате ГГГГММДД.

Итак, в источнике вы можете сделать что-то вроде этого:

#if CURDATE > 20101101
#error "Do whatever you have to do"
#endif

Можете ли вы сделать что-то подобное в VS?

6 голосов
/ 01 сентября 2010

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

Если ничего другого, сборки должны быть воспроизводимыми. Что если в декабре вы поймете, что вам нужно воспроизвести сборку с октября? Вы не можете (по крайней мере, не без включения часов на сборочной машине), потому что он больше не будет компилироваться.

Итак, я бы сделал это:

support2005.h
-------------

// empty file

source file
-----------

#include "support2005.h"
#if _MSC_VER >= 1600
   // clean version of the source code
#else
   // less clean version
   // of the source code
   // requiring multiple lines of code
   // and requiring some dirty static_casts
#endif

Как только у всех будет VS 2010, измените support2005.h на #error "Remove Visual Studio 2005 compatibility code from this file".

На самом деле я лично не проверял бы это изменение, поскольку оно не позволит никому выполнять какую-либо работу до тех пор, пока не будет удалена поддержка VS 2005. Является ли удаление мертвого кода действительно первоочередной задачей для вашей компании утром 1 ноября? И для этого нужны все руки на палубе? Скорее, я бы проверил, удалил файл, выполнил полную сборку, продолжал удалять код совместимости, пока все снова не собралось, и проверил все это как "удалить поддержку VS 2005".

Вы говорите, что волнуетесь, что можете забыть, но если так, то что? Мертвый код никому не вредит. Вы запомните это в следующий раз, когда вы посмотрите на любой из этих файлов, или в следующий раз, когда вы увидите «support2005.h» в списке файлов, графике зависимостей заголовка и т. Д. Так что это не «делает исходный код нечитаемым в долгосрочной перспективе» ", потому что в течение долгого времени любой, кто видит это, может просто проигнорировать или удалить это. Если у вас есть какое-либо программное обеспечение для отслеживания проблем, вы можете найти первую веху, намеченную после 2010-11-01, и прикрепить к ней задачу «удалить поддержку VS 2005 и избавиться от support2005.h» с примечанием. что это в настоящее время заблокировано разработчиками, все еще использующими VS 2005.

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

2 голосов
/ 01 сентября 2010

Я бы просто использовал определение препроцессора, например #ifdef WARN_OLD_COMPAT.В случае с задержанной почтой вы помните, что вам нужно это определить.

Проверка, если дата компиляции более поздняя, ​​чем , невозможна другими способами.

1 голос
/ 01 сентября 2010

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

...