在#include中获取当前编译单元名称

Get current compilation unit name within #include

本文关键字:编译 单元 #include 获取      更新时间:2023-10-16

我目前的目标是创建一行(或尽可能少的)代码,将活动编译单元的其余部分切换到未优化的调试配置。我最初的直觉是:

FORCE_DEBUG;
// code below here will be forced to be unoptimized and in a debug environment

#include "ForceDebug.h"
// code below here will be forced to be unoptimized and in a debug environment

将是理想的。在我的工作区中,要转换为未优化的调试配置,我需要更改pragma优化级别,但也需要#取消定义一些宏和#定义其他宏。

FORCE_DEBUG宏不起作用,因为它需要执行预处理器指令#undef和#define,据我所知,这些指令在宏中是不可评估的。

相反,我有一个#include"ForceDebug.h"的工作版本。但我想告诉开发人员,他们已经禁用了对给定编译单元的优化(所以他们不会签入它,或者如果他们签入了它,就可以捕获并修复它)。理想情况下,此消息包括文件号中包含"ForceDebug.h"或当前编译单元的文件名。

这是一个大约ForceDebug.h

#pragma once
#pragma message("DISABLING OPTIMIZATION IN" COMPILATION_UNIT_FILE)
#undef _RELEASE
#define _DEBUG
#ifdef _MSC_VER
# pragma optimize("", off)
#else
# pragma GCC optimize("O0")
#endif

因此,一个呼叫网站看起来像Foo.cpp:

// this messages "ForceDebug.h", I want to message "Foo.cpp"
//#define COMPILATION_UNIT_FILE __FILE__ 
// double macro also messages "ForceDebug.h"
//#define COMPILATION_UNIT_FILE COMPILATION_UNIT_FILE2(__FILE__)
//#define COMPILATION_UNIT_FILE2(x) x
// this works but requires doing it manually, which I'm trying to avoid
#define COMPILATION_UNIT_FILE "Foo.cpp"
#include "ForceDebug.h"
// code below here will be forced to be unoptimized, debug environment

我不能使用__FILE__,因为当我想让它报告Foo.cpp.时,会有关于ForceDebug.h的消息

如果我可以在Foo.cpp中评估__FILE__,并将评估的版本传递到ForceDebug.h中,这是可以接受的,但我尝试了递归宏调用,它仍然报告了ForceDebug.h

有没有任何方法可以让它将"Foo.cpp"传递到include中,或者通过clang或Visual Studio的其他方式派生该值?

我找不到从包含的文件中发出当前编译单元名称的方法。

但是,您提出的语法要求"ForceDebug.h"的用户添加另一个指令,以便将其编译单元名称公开到头文件中。相反,您可以扭转局面,允许简单的包含,该包含定义了允许发出消息的宏。

虽然一般来说,宏不能用于生成预处理器指令,但对于您所示的编译器,有一种用于杂注的语法。MSVC和GCC都有自己的语法,但条件编译可以使语法看起来统一。

在您的源文件中:

#include "ForceDebug.h"
FORCE_DEBUG;
//... rest of source

"ForceDebug.h":中

#pragma once
#ifdef _MSC_VER
#define DO_PRAGMA(X) __pragma(X)
#define NO_OPT optimize("", off)
#else
#define DO_PRAGMA2(X) _Pragma(#X)
#define DO_PRAGMA(X) DO_PRAGMA2(X)
#define NO_OPT GCC optimize("O0")
#endif
#define FORCE_DEBUG 
        DO_PRAGMA(message("DISABLING OPTIMIZATION IN " __FILE__)) 
        DO_PRAGMA(NO_OPT) 
        struct __force_debug
#undef _RELEASE
#define _DEBUG

您可以使用__FILE__预定义的宏,如下所示:

#pragma message("DISABLING OPTIMIZATION IN " __FILE__)

实时演示

编辑:

既然你想报告.cpp文件,我就另辟蹊径了。也就是说,我会将ForceDebug.h更改为:

#pragma once
#undef _RELEASE
#define _DEBUG
#define OPT_OFF
^^^^^^^^^^^^^^^
#ifdef _MSC_VER
# pragma optimize("", off)
#else
# pragma GCC optimize("O0")
#endif

然后我会把潜在的消息放在.cpp文件中:

#include "foo.h"
...
#ifdef OPT_OFF
#pragma message("DISABLING OPTIMIZATION IN " __FILE__)
#endif