c – 在#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优化级别,还需要#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的其他方式派生该值? 解决方法
我无法找到从包含文件中发出当前编译单元名称的方法.
但是,您提出的语法要求“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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |