2008-10-12 83 views

回答

67

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害羞’作爲名稱的一部分。

-2

#define TEST_FUN_NAME #FUNC_NAME

看到here

+2

它不起作用。看到我的答案。 – jfs 2008-10-12 20:30:51

+2

這確實是不正確的 - 另見我的答案。它有4個選票也是令人驚訝的。麻煩的是,如果你沒有仔細考慮,它看起來可能或多或少是正確的。 – 2008-10-12 20:36:13

0
#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

+1

它也不起作用。看到我的答案。 – jfs 2008-10-12 20:34:32

12

@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 
相關問題