cl.exe の組み込みマクロを確認する方法
-
01-10-2019 - |
質問
cl.exeの組み込み/定義済みマクロを確認する方法を知っている人はいますか?たとえば、gcc の場合、次のコマンド ラインはコンパイラのすべての組み込みマクロをリストします。
gcc -dM -E - </dev/null
編集: 私は、「実際のコンパイラに問い合わせる」という gcc に似た方法に興味があります。
ありがとう
解決
この方法は、事前定義されたマクロのリストをコンパイラに尋ねることになりますが、文書化されていない機能を使用し、部分的なリストのみを提供します。完全性のためにここに含めます。
Microsoft C /C ++コンパイラにより、.Cおよび.CPPファイルの /B1および /BXコマンドラインスイッチをそれぞれ使用して、代替コンパイラフロントエンドを呼び出すことができます。コマンドラインインターフェイスモジュールCl.exeは、MSC_CMD_FLAGS環境変数を介して、交換コンパイラフロントエンドにオプションのリストを渡します。このオプションのリストには、事前定義されたマクロの一部の-Dマクロ定義が含まれています。
次の些細な交換コンパイラフロントエンドのフロントエンドを印刷します。
/* MyC1.c */
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *p;
if ((p = getenv("MSC_CMD_FLAGS")) != NULL)
printf("MSC_CMD_FLAGS:\n%s\n", p);
if ((p = getenv("MSC_IDE_FLAGS")) != NULL)
printf("MSC_IDE_FLAGS:\n%s\n", p);
return EXIT_FAILURE;
}
これを「myc1.exe」という名前の実行可能ファイルにコンパイルします。パスに表示されていることを確認し、次のいずれかを使用してコンパイラフロントエンドとして呼び出すようにcl.exeに伝えます。
cl /B1MyC1.exe AnyNameHere.c
cl /BxMyC1.exe AnyNameHere.cpp
必要に応じて、その一連のオプションに事前に定義されているマクロを確認するために必要な他のコマンドラインオプションを含めます。
結果の出力では、-dオプションを探します。以下に例を示します。実際の出力では、リストはスペースを分離され、各マクロ定義の前に-dがあり、他のオプションも存在します。
_MSC_EXTENSIONS
_INTEGRAL_MAX_BITS=64
_MSC_VER=1600
_MSC_FULL_VER=160030319
_MSC_BUILD=1
_WIN32
_M_IX86=600
_M_IX86_FP=0
_MT
この手法には、コマンドラインオプションに依存するほとんどのマクロが含まれているようですが、__file__や__date__などのように常に定義されているオプションは除外されます。
他のヒント
/P
プリプロセッサ フラグは、プロジェクトのビルド設定に基づいて現在アクティブなマクロを出力します。あなたが示した gcc コマンドと正確に同等かどうかはわかりません。出力は次のとおりです .I
ファイル。
ソースで情報を入手してください!
http://msdn.microsoft.com/en-us/library/b0084kay%28 = vs.90%29.aspx
試してみてください Predefプロジェクト. 。多くのターゲットプラットフォーム、ホストプラットフォーム、コンパイラツールチェーンの事前定義されたマクロのデータベースを維持しています。
また、文書化されているかどうかにかかわらず、事前定義されたすべての名前をすべて発見しようとするスクリプトもあります。実行することで動作します strings
コンパイラのユーティリティ、それを処理してもっともらしい候補のトークンを取得し、各トークンのテストコンパイルを試します。速くはありませんが、多くのマクロを発見するのがかなり上手です。