14

ソフトウェアの v1 および v2 バージョンがあります。v1 はレジストリを使用して設定を保存し、GetProfileInt などを多数呼び出します。v2 は設定を保存するために sqlite db を使用するようになりました。

現在、両方のブランチを開発しており、新しい機能を v1 から v2 ブランチにマージしています。現在、新しい構成データベースを使用するためにレジストリ呼び出しを更新することを忘れないでください。これは数回見逃されています。

私が望むのは、GetProfile... または WriteProfile... 関数のいずれかが v2 で使用されている場合にコンパイラ エラーをスローすることです。

Visual Studio 2010 で C++ を使用しています。何も組み込まれていない場合は、スクリプトからの出力を使用して何らかの方法でコンパイラ エラーをスローできますか?

4

6 に答える 6

12

この回答は受け入れられているので、質問者が実際に使用したソリューションを含めることもできます。

jacobsee が非推奨のプラグマを発見しました

#pragma deprecated(GetProfileInt)

元の答え:

を使用して非推奨として宣言できる場合があります__declspec(deprecated)。次のようになります。

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

気になるすべての翻訳単位に含まれるヘッダーから行う必要があります。これを行うと、非推奨の宣言を含む翻訳単位がその関数を使用するたびに警告が発生します。

コンパイラ エラーが必要で、プロジェクトが警告をエラーとしてまだ処理していない場合は、それをオンにして、無視してきたすべての警告を修正する必要があります。(これらは、このソリューションを使用するかどうかに関係なく、優れた方法です。)

于 2012-05-23T20:43:54.400 に答える
3

私のコメントを回答に昇格させる:

マクロを使用して、コンパイルできないものに再定義できます。

#define GetProfile  HAHA_Nice_try_This_will_not_compile!!!

問題は、コードの外で (正当に) 呼び出されていないことを確認する必要があることです。
(したがって、すべてのインクルードの後に​​マクロを配置する必要があります。)

于 2012-05-23T20:39:51.940 に答える
2

受け入れられた答えは、関数を非推奨としてマークすることですが、それは2つの理由から、質問が求めているものに実際には適合しません:

  • エラーではなく、警告を表示するだけです。
  • v1 コードを使用している場合でも、警告が表示されます。

それを望むのには十分な理由がありますが、実際には元の質問が求めているものではありません。

幸いなことに、質問が求めるものを取得するための非常に簡単な方法があります。関数が単に存在しない場合、コンパイラは常にエラーをスローします。に関数を投げるだけ#ifndefです。

#ifndef V2

void GetProfile()
{
  // Get the profile
}

void WriteProfile()
{
  // Write the profile
}

#endif
于 2014-07-09T22:22:58.670 に答える
1

一般的な #include ファイルがある場合は、次のようなものを (必要に応じてWまたはAを使用して) 追加できます。少なくとも、リンカー エラーが発生します (コンパイラの警告/エラーはフラグに依存します)。

#define GetProfileIntA InvalidFunctionDoNotCallMe

GetProfileIntWindows では、A または W バージョンにマクロ などの機能が既に定義されています。

于 2012-05-23T20:38:32.313 に答える
0

私はあなたができると信じて#define GetProfileInt(a, b, c) "don't use this";#includeますWindows.h

は適切な関数にルーティングするためGetProfileIntのマクロであるため、マクロの再定義が必要になります。そして、char[]に割り当てることができないためUINT、コンパイラerrorの .

汚い、汚いハックですが、それについて話し合うためにシャワーを浴びたいと思います。

于 2012-05-23T20:43:56.167 に答える