如何检查是否可以使用__PRETTY_FUNCTION__?

时间:2010-11-12 11:54:02

标签: c++ macros c-preprocessor

...../PluginLoader.h:34: multiple definition of 'Dummy_Func_For_Generating_FUNCTION_NAME_Macro()'

以下代码输出以上错误。我在我的档案中加入了警卫。其他一切都很好。

编辑:我想要检查的是检查__PRETTY_FUNCTION__是否已定义,如果是,请稍后在代码中通过FUNCTION_NAME宏使用它(用于记录目的)。如果未定义__PRETTY_FUNCTION__,请使用下一个最好的东西,依此类推。然而,我得到的回应让我意识到这是不可能的。那么,如果__PRETTY_FUNCTION__和所有其他的不是宏,那么它们是什么?我如何检查某个实现是否有其中一个?

    void Dummy_Func_For_Generating_FUNCTION_NAME_Macro()
    {
#ifndef FUNCTION_NAME
    #ifdef __PRETTY_FUNCTION__
        #define FUNCTION_NAME __PRETTY_FUNCTION__
    #elif __FUNCTION__
        #define FUNCTION_NAME __FUNCTION__
    #elif __func__
        #define FUNCTION_NAME __func__
    #else
        #define FUNCTION_NAME ""
    #endif
#endif
    }

4 个答案:

答案 0 :(得分:13)

void Dummy_Func_For_Generating_FUNCTION_NAME_Macro()是一个函数,而不是宏。函数不会创建宏。宏在预处理器阶段解析,并在编译阶段起作用。删除函数定义并仅保留#ifndef块。

使用编译器识别宏来确定使用哪个函数识别宏。例如:

#ifdef _MSC_VER // Visual Studio
    #define FUNCTION_NAME __FUNCTION__
#endif

答案 1 :(得分:5)

__PRETTY_FUNCTION____FUNCTION__不是预处理器宏,如__LINE____FILE__,但是魔术常量它们在预处理器时间不可用,但在编译时稍后(在函数中)范围)。

所以无论你想用宏做什么,这里都可能无法工作。

然而编译错误可能是一个问题。我成功地编译了一个不同的程序(见下文),没有任何问题。但正如我上面所说,FUNCTION_NAME将始终设置为空字符串。

xx.h头文件

#ifndef H_XX_H
#define H_XX_H

#ifndef FUNCTION_NAME
    void Dummy_Func_For_Generating_FUNCTION_NAME_Macro()
    {
    #ifdef __PRETTY_FUNCTION__
        #define FUNCTION_NAME __PRETTY_FUNCTION__
    #elif __FUNCTION__
        #define FUNCTION_NAME __FUNCTION__
    #elif __func__
        #define FUNCTION_NAME __func__
    #else
        #define FUNCTION_NAME ""
    #endif
   ;
   }
#endif
#endif

xx.c源文件

#include <stdio.h>
#include "xx.h"

main(){
    printf("%s\n", FUNCTION_NAME);
}

答案 2 :(得分:0)

我曾经遇到过这个问题,这是由挂载磁盘引起的:

  

subst R:C:\ Source \

Test.cpp:

 #include "C:\Source\PluginLoader.h"  
 #include "R:\PluginLoader.h"

现在,如果你将guard包含在#pragma中一次,编译器就不够聪明,不知道它们是实际的一个文件,从而导致重新定义错误。

但是,我不确定这是否是您的问题,因为它取决于:

  • 您从两个虚拟磁盘中包含 和物理磁盘
  • 你的包含守卫是#pragma一次,而不是宏观守卫

答案 3 :(得分:0)

将您的功能放在anonymous namespace中。这将消除duplicate function定义errors。即。

 namespace {
     function goes here
  }