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_函数等常量才被初始化,回想起来,这似乎很明显:)