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

nak*_*iya 6 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
    }
Run Code Online (Sandbox Code Playgroud)

Dia*_*cus 14

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

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

#ifdef _MSC_VER // Visual Studio
    #define FUNCTION_NAME __FUNCTION__
#endif
Run Code Online (Sandbox Code Playgroud)

  • @Dialecticus:我只是确保定义了'FUNCTION_NAME`.正是因为预处理器在编译之前运行,我才知道要使用什么宏. (2认同)

kri*_*iss 5

__PRETTY_FUNCTION__并且__FUNCTION__不是像__LINE__or 那样的预处理器宏__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
Run Code Online (Sandbox Code Playgroud)

xx.c源文件

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

main(){
    printf("%s\n", FUNCTION_NAME);
}
Run Code Online (Sandbox Code Playgroud)