2016-12-05 85 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)惯用法有助于避免意外的扩展,从而改变控制流。