Подтвердить что ты не робот

Могу ли я принудительно выполнить ошибку компилятора, если вызываются определенные функции?

У меня есть версии моего программного обеспечения v1 и v2. v1 использует реестр для сохранения настроек, с большим количеством вызовов GetProfileInt и т.д. v2 теперь использует sqlite db для сохранения настроек.

В настоящее время мы разрабатываем обе ветки и объединяем новые функции из v1 в ветвь v2. В настоящее время мы должны помнить, что нужно обновлять любые обращения к реестру, чтобы использовать новую конфигурацию db, и это было пропущено несколько раз.

Я бы хотел сбросить ошибку компилятора, если в v2 используются какие-либо из функций GetProfile... или WriteProfile...

Мы используем С++ в Visual Studio 2010. Если ничего не встроено, я могу использовать вывод из script, чтобы каким-то образом выбросить ошибку компилятора?

4b9b3361

Ответ 1

Поскольку этот ответ принят, я мог бы также включить решение, которое фактически использовал искатель:

jacobsee обнаружил устаревшую прагму

#pragma deprecated(GetProfileInt)

Оригинальный ответ:

Вы можете объявить их как устаревшие, используя __declspec(deprecated). Это будет выглядеть так:

UINT __declspec(deprecated) WINAPI GetProfileInt(
  __in  LPCTSTR lpAppName,
  __in  LPCTSTR lpKeyName,
  __in  INT nDefault
);

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

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

Ответ 2

Продвижение моего комментария к ответу:

Вы можете использовать макрос, чтобы переопределить их для того, что не будет компилироваться:

#define GetProfile  HAHA_Nice_try_This_will_not_compile!!!

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

Ответ 3

Если у вас есть обычный файл #include, вы можете добавить к нему что-то вроде этого (при необходимости W или A). Это приведет, по крайней мере, к ошибке компоновщика (предупреждение/ошибка компилятора будет зависеть от флагов):

#define GetProfileIntA InvalidFunctionDoNotCallMe

Windows уже определяет такие функции, как GetProfileInt, как макросы для версий A или W.

Ответ 4

Принятый ответ заключается в том, чтобы отметить функции как устаревшие, но это не соответствует тому, что задает вопрос, по двум причинам:

  • Он выдает предупреждение, а не ошибку.
  • Это даст предупреждения, даже если вы используете код v1.

Есть хорошие причины, чтобы этого хотеть, но на самом деле это не то, что задает первоначальный вопрос.

К счастью, есть очень простой способ получить ответы на вопросы. Компилятор всегда выдает ошибку, если функция просто не существует. Просто бросьте функции в #ifndef.

#ifndef V2

void GetProfile()
{
  // Get the profile
}

void WriteProfile()
{
  // Write the profile
}

#endif

Ответ 5

Я верю, что вы могли #define GetProfileInt(a, b, c) "don't use this"; после #include 'ing Windows.h.

Так как GetProfileInt является макросом для маршрутизации к правильной функции, это приведет к переопределению макросов. А поскольку char[] не может быть присвоено UINT, компилятор error.

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