0

タイトルがおかしいのはわかっているので、以下に説明します。

変更したくないコードがいくつかありますが、いくつかの関数を再定義する必要があります。最小限の例は次のとおりです。

int main()
{
strcpy_s(a,b);
}

しかし、これを実行すると:

$ g++ -E -P -w -D"strcpy_s(D,S)   strcpy(D,S) buahaha" test.cpp

私は得る:

int main()
{
strcpy(a,b) buahaha 1;
}

これは何1ですか?buahaha は無視してください。PP が何かを行うことを示すだけです。

4

2 に答える 2

5

-Dこのオプションを使用する方法は2つあります。

  • -Dname
  • -Dname=value

最初はとして定義nameされ1、2番目はとして定義nameされvalueます。

nameコマンドラインで関数のようなマクロを定義できるように、括弧を含めることができます。のようなもの-Dfoo barには等号が含まれていないため、として定義する試みとして解釈されfoo barます1。マクロ名にスペースを含めることはできないため、エラーメッセージが表示される可能性がありますが、検出されず、コンパイラが混乱することになります。-D"strcpy_s(D,S)=strcpy(D,S) buahaha"代わりに試してください。

私が起こっているのは、-Dnameに変換され#define name 1、に-Dname=value変換されていると思われる#define name valueことです。エラーチェックはその後にのみ発生します。これはに変換-D"strcpy_s(D,S) strcpy(D,S) buahaha"され#define strcpy_s(D,S) strcpy(D,S) buahaha 1、得られる結果を説明します。

于 2013-03-05T13:08:08.263 に答える
2

ドキュメントには、-Dオプションの構文に等号が含まれていることが示されていますが、これは使用していません。

コマンドはおそらく次のようになります。

$ g++ -E -P -w -D"strcpy_s(D,S)=strcpy(D,S)" test.cpp
于 2013-03-05T13:07:54.753 に答える