C++ 如何检查是否可以使用“漂亮”功能?
C++ 如何检查是否可以使用“漂亮”功能?,c++,macros,c-preprocessor,C++,Macros,C Preprocessor,…../PluginLoader.h:34:Dummy\u Func\u的多个定义,用于生成函数名宏() 以上错误是以下代码的输出。我的档案里有警卫。其他一切都很好 编辑:我试图实现的是检查\uu PRETTY\u FUNCTION\uu是否已定义,如果已定义,则稍后在代码中通过FUNCTION\u NAME宏使用它(用于日志记录)。如果未定义\uuuu PRETTY\u FUNCTION\uuuu,请使用次优选项,依此类推。然而,我得到的回应让我意识到这是不可能的。那么,如果\uu PRETT
…../PluginLoader.h:34:Dummy\u Func\u的多个定义,用于生成函数名宏()
以上错误是以下代码的输出。我的档案里有警卫。其他一切都很好
编辑:我试图实现的是检查\uu PRETTY\u FUNCTION\uu
是否已定义,如果已定义,则稍后在代码中通过FUNCTION\u NAME
宏使用它(用于日志记录)。如果未定义\uuuu PRETTY\u FUNCTION\uuuu
,请使用次优选项,依此类推。然而,我得到的回应让我意识到这是不可能的。那么,如果\uu PRETTY\u FUNCTION\uuu
和所有这些都不是宏,它们是什么?我如何检查某个实现是否具有其中之一
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
}
void Dummy\u Func\u For\u Generating\u FUNCTION\u NAME\u Macro()
是一个函数,而不是宏。函数不创建宏。宏在预处理器阶段解析,函数在编译器阶段解析。删除函数定义,只保留#ifndef
块
使用编译器识别宏来确定要使用哪个函数识别宏。例如:
#ifdef _MSC_VER // Visual Studio
#define FUNCTION_NAME __FUNCTION__
#endif
\uuuu PRETTY\u FUNCTION\uuuu
和\uuuu FUNCTION\uuuu
不是像\uuu LINE\uuuu
或\uu FILE\uuuuuu
那样的预处理器宏,但它们在预处理器时不可用,但在编译时(在函数范围内)以后才可用
因此,无论您在这里尝试如何处理宏,都可能无法正常工作
不过,编译错误可能是guard的问题。我成功地编译了一个不太不同的程序(见下文),没有任何问题。但正如我上面所说的,函数名称将始终设置为空字符串
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);
}
#包括
#包括“xx.h”
main(){
printf(“%s\n”,函数名);
}
我以前遇到过这个问题,它是由安装的磁盘引起的:
subst R:C:\Source\
Test.cpp:
#include "C:\Source\PluginLoader.h"
#include "R:\PluginLoader.h"
现在,如果只包含一次guard is#pragma,编译器就没有足够的智能来知道它们是实际的一个文件,从而导致重新定义错误
但是,我不确定这是否是您的问题,因为这取决于:
- 您可以从两个虚拟磁盘,
和物理磁盘
- 您的include-guard是#pragma-one,而不是macro-guard
.将函数放在匿名命名空间中。这将消除重复函数
定义错误
。即
namespace {
function goes here
}
\uu PRETTY\u FUNCTION\uuuu
、\uuu FUNCTION\uuu
和\uuu func\uuuu
的值是多少?@Adrien:这些都是预定义的宏,但并非所有编译器都实现了这些宏。您是否将此函数放在头中?如果头被多次包含,编译器可能会抱怨它多次找到同一个函数。如果他们不明白你想做什么,没有人能帮助你。所以“这里出了什么问题”是“谁知道?你告诉我们。”据我所知,你的目标是生成编译错误;这里没什么问题。@GMan:我不是想产生编译器错误。我只是想正确定义函数名
。我在标题中清楚地问了我的问题。但是\uuuu PRETTY\u FUNCTION\uuuuu
,\uuuu FUNCTION\uuuu
和\uuuu func\uuuuu
仅在函数中定义@Paul R,宏定义在您实际感兴趣的函数中不应该有scopeUse函数名
,而在伪函数中不应该有scopeUse函数名
,因为它总是解析为伪函数。@Dialogicus:我只是确保定义了函数名
。正是因为预处理器在编译器之前运行,所以我可以知道使用什么宏。这是不可能的。您必须检查编译器(每个编译器都有特殊的标识宏,以及一个版本),而不是检查函数范围宏的存在。\uuu-GUARD
,不要使用它。好的,我想您不是对\uu-GUARD
关键字做出反应,而是对双前导下划线做出反应。+1,我没有意识到,直到编译时,PRETTY_函数等常量才被初始化,回想起来,这似乎很明显:)