Замена всех ссылок на переменную C ++ #define - PullRequest
1 голос
/ 16 июня 2011

Не уверен, есть ли у кого-то опыт поддержки старых кодов.В некоторых старых кодах у меня есть глобальная переменная, на которую ссылаются во многих местах.Я хочу заменить все эти ссылки на мою глобальную переменную на что-то другое, например, на вызов функции.Могу ли я сделать это простым #define в каждом исходном файле?например,

#define legacyGlobalVariable func1("legacyGlobalVariable")

My func1 () примет имя старой переменной и вернет что-то такое же, как у legacyGlobalVariable .

Iзнаю, что #define может заменить legacyGlobalVariable , который формирует токен.Но я не уверен, есть ли какие-то особые случаи, с которыми эта простая техника не может справиться.Например, я знаю, что мне нужно предотвратить это:

legacyGlobalVariable(23);// a badly named function same name as my global var

становится

func1("legacyGlobalVariable")(23);//but at least, it cannot compile

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

Ответы [ 4 ]

3 голосов
/ 16 июня 2011

Основная проблема заключается в том, что #define является злом .Это не улучшит читабельность вашего кода, поэтому я рекомендую просто прикусить маркер и использовать вместо этого функцию поиска / замены вашего редактора.

1 голос
/ 16 июня 2011

ИМХО, если код достаточно старый и работает нормально, то лучше не менять ничего.Следуйте правилу индустрии программного обеспечения: «Не трогай ничего, пока это не понадобится».

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

1 голос
/ 16 июня 2011

Есть ли другие возможные проблемы с этой простой техникой?
Да! А как насчет проверки типа параметра?
Для функции аргументы проверяются на тип и компиляторы возвращают ошибки, если несоответствие типов. С макросами такой проверки типов нет.

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

Вам гораздо лучше заменить его на функцию, а не отображать функцию через макрос.

0 голосов
/ 23 июня 2011

Вы можете использовать некоторые скриптовые языки, например, Perl и автоматизировать поиск и замену, Это дало бы вам больше контроля

например. вы можете легко избежать изменения таких экземпляров

func1 ( "legacyGlobalVariable") (23)

это также экономит много времени.

...