2016-12-05 50 views
1

給出一個項目下面的代碼我工作:GCC __func__被評價爲空字符串

/* Pre-definitions in a pre-definitions file to be included in the project */ 
#ifdef WIN32 
#define __FUNCNAME__ __FUNCTION__ 
#else 
#define __FUNCNAME__ __func__ 
#endif 

/* My definitions */ 
#define MAC() \ 
    MAC1() 

#define MAC1() \ 
    myPrintFunction(__FUNCNAME__) 

/* My print function */ 
void myPrintFunction(const char * functionName) 
{ 
    printf("\n func name: %s \n",functionName); 
} 

/* Macro usage example function */ 
void myFunction() 
{ 
    if (some_condition) 
    { 
     MAC(); 
    } 
} 

函數名稱是作爲一個空字符串。 任何想法爲什麼,我該如何解決它?

使用GCC編譯器在Linux機器上編譯和測試的代碼。

+0

你確定'some_condition'是真的嗎? – freestyle

+2

沒有'main()'?請發佈[最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve)。 – DevSolar

+0

是的,我確定。我可以看到「\ n func名稱:\ n」,並且我正在用調試器調試此代碼,並且正在執行代碼。 – user2162550

回答

5

使用__func__開箱。自C99以來,它一直是C標準的一部分。改變你的編譯器設置至少使用那個標準。

注意__func__宏但預定標識其採取的形式,使得函數體內的任何地方寫它是完全等同於使用它在這一點上,具有第一寫入

static const char __func__[] = "function-name";

剛剛在功能體的開啓支撐之後。

形式上您當前密碼的行爲是不確定的。包含兩個連續下劃線的任何符號都由系統保留。 (包括宏名,函數名和變量名)

+0

我想你的意思是說「任何*宏名稱*包含兩個連續的下劃線......」。 –

+1

對不起,我的意思是說它更強大:宏名稱,函數名稱和變量名稱 – Bathsheba

+0

@TobySpeight:那麼如果我命名一個局部變量'int __func__'呢? – AndyG

1

所呈現您的代碼給出了預期結果(有一次,我添加了必要的包括與主):

#include <stdio.h> 

#ifdef WIN32 
#define __FUNCNAME__ __FUNCTION__ 
#else 
#define __FUNCNAME__ __func__ 
#endif 

/* My definitions */ 
#define MAC() \ 
    MAC1() 

#define MAC1() \ 
    myPrintFunction(__FUNCNAME__) 

void myPrintFunction(const char * functionName) 
{ 
    printf("\n func name: %s \n",functionName); 
} 

int main() 
{ 
    MAC(); 
} 

我該使用編譯gcc -std=c11 -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds沒有警告。

你真的應該發佈一個完整的(但最少)的例子,實際上編譯,與你使用的編譯器標誌一起,看成是必須肯定會有不同的解釋,你描述的症狀。

此外,在將語句寫爲宏時,可能會發現使用do {...} while (0)慣用法有助於避免意外的擴展,從而改變控制流。