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

标签 c++ c macros

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

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 优化级别,还需要#undef 一些宏和#define 其他宏。

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

相反,我有一个#include "ForceDebug.h"的工作版本。但是我想告诉开发人员他们已经禁用了给定编译单元的优化(因此他们不 checkin 它,或者如果他们 checkin 它可以捕获并修复它)。理想情况下,此消息包括任何文件的文件名 #includes "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”传递到包含中或通过其他方式为 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

关于c++ - 在#include 中获取当前编译单元名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34078658/

相关文章:

c++ - Opencv:将平面图图像转换为数据模型

c - 在 C dll 中使用 delphi 回调函数

c - memset 没有设置 num 个字节?

macros - 可以放心地忽略宏和内置宏之间的区别吗?

c++ - Visual Studio 从预定义字符串宏中抛出 "undeclared identifier"

c++ - 如何在成员函数线程中调用回调?

c++ - 训练一个非常大的神经网络

c++ - 使用递归将基数提高到它的指数 - C++

python - 用于可变参数长度的 Swig 包装器

C 预处理器宏扩展