恥ずかしがり屋*である彼はあなたに答えの胚芽を与えましたが、胚芽だけです。Cプリプロセッサで値を文字列に変換するための基本的な手法は、実際には「#」演算子を使用することですが、提案されたソリューションの単純な音訳では、コンパイルエラーが発生します。
#define TEST_FUNC test_func
#define TEST_FUNC_NAME #TEST_FUNC
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
構文エラーは「puts()」行にあります-問題はソースの「漂遊#」です。
C標準のセクション6.10.3.2、「#演算子」では、次のように述べています。
関数のようなマクロの置換リスト内の各#前処理トークンの後に、置換リスト内の次の前処理トークンとしてのパラメーターが続くものとします。
問題は、マクロ引数を文字列に変換できることですが、マクロ引数ではないランダムなアイテムを変換することはできません。
ですから、あなたが求めている効果を達成するために、あなたは確かにいくつかの追加の仕事をしなければなりません。
#define FUNCTION_NAME(name) #name
#define TEST_FUNC_NAME FUNCTION_NAME(test_func)
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
マクロをどのように使用する予定であるか、および繰り返しを完全に回避する方法については、完全には明確ではありません。この少し手の込んだ例は、より有益かもしれません。STR_VALUEと同等のマクロの使用は、目的の結果を得るために必要なイディオムです。
#define STR_VALUE(arg) #arg
#define FUNCTION_NAME(name) STR_VALUE(name)
#define TEST_FUNC test_func
#define TEST_FUNC_NAME FUNCTION_NAME(TEST_FUNC)
#include <stdio.h>
static void TEST_FUNC(void)
{
printf("In function %s\n", TEST_FUNC_NAME);
}
int main(void)
{
puts(TEST_FUNC_NAME);
TEST_FUNC();
return(0);
}
*この回答が最初に書かれたとき、shooshの名前は名前の一部として「Shy」を使用していました。