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)
__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)