...../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
}
答案 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中一次,编译器就不够聪明,不知道它们是实际的一个文件,从而导致重新定义错误。
但是,我不确定这是否是您的问题,因为它取决于:
答案 3 :(得分:0)
将您的功能放在anonymous namespace
中。这将消除duplicate function
定义errors
。即。
namespace {
function goes here
}