23

cl.exeの組み込み/事前定義されたマクロを見つける方法を知っている人はいますか?たとえば、gccの場合、次のコマンドラインにコンパイラの組み込みマクロがすべて一覧表示されます。

gcc -dM -E - </dev/null

編集:「実際のコンパイラに尋ねる」というgccに似た方法に興味があります。

ありがとう

4

5 に答える 5

27

この方法は、事前定義されたマクロのリストをコンパイラーに要求することになりますが、文書化されていない機能を使用し、リストの一部しか提供しません。完全を期すためにここに含めます。

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」などの名前の実行可能ファイルにコンパイルし、PATHに表示されていることを確認し、次のいずれかを使用してコンパイラフロントエンドとして呼び出すように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__などの常に定義されているマクロは除外されています。

于 2010-09-08T22:19:27.937 に答える
5

/Pプリプロセッサフ​​ラグは、プロジェクトのビルド設定に基づいて、現在アクティブなマクロを発行します。それがあなたが示したgccコマンドと正確に同等であるかどうかはわかりません。出力は.Iファイルにあります。

于 2010-09-08T08:09:02.860 に答える
3

ソースで情報を入手してください!

http://msdn.microsoft.com/en-us/library/b0084kay%28v=VS.90%29.aspx

于 2010-09-08T07:38:37.683 に答える
3

predefプロジェクトを試してください。これらは、多くのターゲットプラットフォーム、ホストプラットフォーム、およびコンパイラツールチェーンの事前定義されたマクロのデータベースを維持します。

また、文書化されているかどうかに関係なく、事前定義されたすべての名前を検出しようとするスクリプトもあります。これはstrings、コンパイラー上でユーティリティを実行し、それを処理してもっともらしい候補トークンを取得し、各トークンのコンパイルをテストすることによって機能します。速くはありませんが、たくさんのマクロを見つけるのはかなり得意です。

于 2010-09-08T09:23:47.227 に答える
0

これがどのバージョンで利用可能になったのかわかりません。

/PDはすべてのマクロ定義を出力します

于 2021-07-12T22:50:22.997 に答える