Ограничить время, в течение которого функция может использоваться в кодовой базе - PullRequest
2 голосов
/ 23 марта 2011

Вот что я пытаюсь сделать:

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

Есть идеи?

Обновление: Я забыл упомянуть, что моя функция находится в пространстве имен.

Ответы [ 4 ]

4 голосов
/ 23 марта 2011

Для gcc вы можете использовать атрибут «deprecated».

int old_fn () __attribute__ ((deprecated));

Это будет выдавать предупреждение каждый раз, когда функция используется где-то.

4 голосов
/ 23 марта 2011

Не помещайте это в заголовки, для начала. Локально объявите его в файле .c, чтобы он не был публично видимым.

Затем вы можете сделать это также:

public_header.h:

     #define my_function(arg1, arg2, ...) exit(128)

А в файле .cpp, который фактически должен использовать его:

     #undef my_function
     int my_function(int arg1, char *arg2, ...);
1 голос
/ 23 марта 2011

В составе C ++ нет.

Конечно, есть хитрости.

Одним из таких приемов является объявление функции как можно локально вблизи текущей точки использования.

  • Просто объявив его в верхней части исходного файла, используйте его, прямо под включением
  • Объявление (и определение) как static в верхней части исходного файла, который его использует, лучше для наглядности, но подразумевает дублирование

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

Другие решения включают #pragma warning в заголовке (не очень) или атрибут deprecated, но это вызовет предупреждения для текущих применений, это может быть проблематично (загрязняет выходные данные сборки). И если людям не надоедают предупреждения для текущего использования, они не будут беспокоиться и о новых предупреждениях, что не является хорошей привычкой!

Теперь есть и другие решения.

Вы можете просто написать хук, который сканирует исходные файлы и подсчитывает количество вхождений.

grep -r "deprecated_func" include src | wc -l

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

Примечание: вы также можете использовать атрибут deprecated с фильтром на выходе компилятора. Но это не считается для -Werror.

0 голосов
/ 23 марта 2011

Очень интересный вопрос! Это заставило меня задуматься о том, будет ли работать комбинация форсированного препроцессора BOOST_PP_COUNTER и BOOST_STATIC_ASSERT (или static_assert в C ++ 0x). Одна большая проблема - каждый раз, когда я заглядываю в библиотеку Boost.Preprocessor, у меня кружится голова:)

В конце я хотел бы написать BOOST_STATIC_ASSERT(BOOST_PP_COUNTER <= 3);

У меня нет времени проверять свои идеи прямо сейчас, но, надеюсь, это может привести к чему-то. Я не смогу проверить свои идеи до выходных, хотя ...

...