在#include中获取当前编译单元名称
Get current compilation unit name within #include
我目前的目标是创建一行(或尽可能少的)代码,将活动编译单元的其余部分切换到未优化的调试配置。我最初的直觉是:
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
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用 SCons 提取每个编译单元的编译时间
- 将 lambda 函数转换为另一个编译单元中的普通函数会缩短编译时间吗?
- 模板部分专用化和多个编译单元
- 编译单元之间共享的全局常量对象
- Visual studio是否强制将预编译的头文件包含在项目的所有编译单元中
- 每个编译单元是否只有一个未命名的命名空间
- 当(执行时间)>>>(编译时间)时,多个编译单元是否仍然值得?
- 将模板代码分解为单独的编译单元
- 如何在 Eclipse 中将我的项目从多个编译单元转换为单个编译单元
- cud(编译单元数据)数组值的意义是什么?
- 使用 extern 引用在不同编译单元中定义的函数
- 不是同一编译单元的变量的构造顺序
- 什么是LLVM中编译单元的正确抽象
- 如何更改编译单元的版本
- 在#include中获取当前编译单元名称
- 有没有一种方法可以在编译单元中隐藏C++类定义
- 是一个在C++中以不同编译单元多次编译的模板类
- 在不同的编译单元中使用不同的编译标志编译相同的头