例如,如何避免兩次寫入'func_name'?我想遵循Single Point of Truth規則。 C預處理器的如何從C宏的值中創建一個字符串?
版本:
$ cpp --version
cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
例如,如何避免兩次寫入'func_name'?我想遵循Single Point of Truth規則。 C預處理器的如何從C宏的值中創建一個字符串?
版本:
$ cpp --version
cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
He who is Shy*給了你一個answer的細菌,但只有細菌。用於將值插入在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,「#操作符」,它說:
Each # preprocessing token in the replacement list for a function-like macro shall be followed by a parameter as the next preprocessing token in the replacement list.
麻煩的是,你可以宏參數轉換爲字符串 - 但你不能隨意轉換不是宏參數的項目。
因此,要達到您所追求的效果,您絕對不得不做一些額外的工作。
#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害羞’作爲名稱的一部分。
#include <stdio.h>
#define QUOTEME(x) #x
#ifndef TEST_FUN
# define TEST_FUN func_name
# define TEST_FUN_NAME QUOTEME(TEST_FUN)
#endif
int main(void)
{
puts(TEST_FUN_NAME);
return 0;
}
參考:維基百科的頁面C preprocessor
它也不起作用。看到我的答案。 – jfs 2008-10-12 20:34:32
@Jonathan Leffler:謝謝。你的解決方案有效
一個完整的工作示例:
/** compile-time dispatch
$ gcc -Wall -DTEST_FUN=another_func macro_sub.c -o macro_sub && ./macro_sub
*/
#include <stdio.h>
#define QUOTE(name) #name
#define STR(macro) QUOTE(macro)
#ifndef TEST_FUN
# define TEST_FUN some_func
#endif
#define TEST_FUN_NAME STR(TEST_FUN)
void some_func(void)
{
printf("some_func() called\n");
}
void another_func(void)
{
printf("do something else\n");
}
int main(void)
{
TEST_FUN();
printf("TEST_FUN_NAME=%s\n", TEST_FUN_NAME);
return 0;
}
實施例:
$ gcc -Wall -DTEST_FUN=another_func macro_sub.c -o macro_sub && ./macro_sub
do something else
TEST_FUN_NAME=another_func
的可能的複製[C宏創建字符串](http://stackoverflow.com/questions/798221/c-macros - 創建字符串) – rjstelling 2015-10-06 10:34:06