1

Microsoft の MIDL コンパイラは、この抜粋のコードのように、わずかに無効な C/C++ ソース コード ファイルを生成します。

#ifndef CLSID_DEFINED
#define CLSID_DEFINED
typedef IID CLSID;
#endif // CLSID_DEFINED

#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
        const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}

#endif !_MIDL_USE_GUIDDEF_

後のトークン#endifは Visual C++ によって無視されますが、Holy Standard では何も要求されないため、g++ エラーが発生し、gcc (C としてコンパイル) でさえ警告が生成されます。

H:\dev\tools\better keyboard\test> gcc com_server\com_server_i.c -c
com_server\com_server_i.c:68:8: 警告: #endif ディレクティブの末尾に余分なトークンがあります
 #endif !_MIDL_USE_GUIDDEF_
        ^

H:\dev\tools\better keyboard\test>_

コードが生成されるたびに手動で修正するのは面倒で面倒です。

gcc がコードをコンパイルする必要があると仮定して、この明らかに名前のない警告を回避するためのより良い方法はありますか?

this に関する既存の質問を大まかに見ましたが、役に立ちませんでした。

4

1 に答える 1

3

コメントを回答に変換します。

最も単純なメカニズムは、おそらく生成されたコードを後処理することです。

sed -i.bak -e 's/^#endif .*/#endif/' com_server/com_server_i.c

または同等のもの。または、 の後に素材を保存して、#endifそこにコメントを入れることもできます。

sed -i.bak -e 's%^#endif \(.*\)%#endif // \1%' com_server/com_server_i.c

を使用している場合makefile、MIDL コンパイラの呼び出し後に追加操作として後処理を追加するのは非常に簡単です。

相互参照された質問はすぐには役に立ちません。これは!、マクロ定義では削除できません。実際には、 の後にマクロが存在すると、マクロ#endifが何も展開されない場合でも警告が表示されます。

MIDL コンパイラに関する Microsoft のバグ レポートを確認しましたか (修正を拒否する既知の問題であるかどうかを確認するため)。また、MIDL コンパイラのオプションをチェックして、これを修正するものがあるかどうかを確認しましたか?

于 2015-03-19T20:09:17.767 に答える