获取#include

时间:2015-12-04 00:06:34

标签: 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”的工作版本。但我想告诉开发人员他们已经在给定的编译单元上禁用了优化(因此他们不会检查它,或者他们是否检查它可以捕获并修复)。理想情况下,此消息包含#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__因为有关ForceDebug.h的消息,当我希望它报告有关Foo.cpp时。

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

有没有办法让它将“Foo.cpp”传递给include,或者通过其他方式为clang或Visual Studio派生该值?

2 个答案:

答案 0 :(得分:1)

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

但是,您提出的语法要求"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

答案 1 :(得分:0)

您可以使用下面的__FILE__ predefined macro

#pragma message("DISABLING OPTIMIZATION IN " __FILE__)

Live Demo

编辑:

由于你想报告.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