web-dev-qa-db-ja.com

コンパイル時に#defineの値をgccで表示するにはどうすればよいですか?

これまでのところ、私は次のことを行っています。

#define ADEFINE "23"
#pragma message ("ADEFINE" ADEFINE)

どちらが機能しますが、ADEFINEが文字列でない場合はどうなりますか?

#define ADEFINE 23
#pragma message ("ADEFINE" ADEFINE)

原因:

警告:不正な形式の「#pragmamessage」、無視されます

理想的には、未定義を含むすべての値を処理できるようにしたいと思います。

23

文字列ではないマクロを表示するには、 マクロを文字列化する

#define STRINGIFY(s) XSTRINGIFY(s)
#define XSTRINGIFY(s) #s

#define ADEFINE 23
#pragma message ("ADEFINE=" STRINGIFY(ADEFINE))

boost を持っている/欲しい場合は、 boost stringize を使用してそれを行うことができます。

#include <boost/preprocessor/stringize.hpp>
#define ADEFINE 23
#pragma message ("ADEFINE=" BOOST_PP_STRINGIZE(ADEFINE))
26
rob05c

これがあなたの望むことをするかどうかはわかりませんが、時折発生するマクロの問題をデバッグするためだけにこれに興味がある場合(したがって、コンパイルごとにメッセージに表示する必要はありません)、次のことがうまくいく可能性があります。 gccの-E -dDオプションを使用して、#defineディレクティブを前処理出力とともにダンプします。次に、それをgrepにパイプして、必要な行だけを表示します。

// test.c
#include <stdlib.h>
#include <stdio.h>
#define ADEFINE "23"
#include <string.h>

int main(int argc, char *argv[])
{
#undef ADEFINE
#define ADEFINE 42
    return 0;
}

コマンドgcc -E -dD -c test.c | grep ADEFINEは次のことを示しています。

#define ADEFINE "23"
#undef ADEFINE
#define ADEFINE 42
7
Michael Burr