2015-12-04 32 views
4

中獲取當前編譯單元名稱我的當前目標是創建一個(或儘可能少的)代碼行,以將活動編譯單元的其餘部分切換爲未優化的調試配置。我的第一直覺是兩種:在#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。

如果我能評價__FILE__內Foo.cpp中並通過評估版本到ForceDebug.h這將是可以接受的,但我想遞歸宏調用,它仍然報道ForceDebug.h

有沒有什麼辦法讓它將「Foo.cpp」傳遞給include還是通過用於clang或Visual Studio的其他方式派生該值?

+0

當前文件的名稱是'__FILE__'。 – greyfade

+0

糟糕,我知道'__FILE__',但它不能正確地從Foo.cpp轉移到ForceDebug.h,它報告「ForceDebug.h」而不是「Foo.cpp」 –

+0

我修改了這個問題以反映我瞭解'__FILE__',但是這並沒有讓我報告Foo.cpp –

回答

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 
+0

它傷害了注意在源文件中放置這樣的__FILE__引用,即使結果字符串從不使用。然後頭文件可以有一個宏,該宏使得包含__FILE__引用的代碼塊/行成爲可能 – user3629249

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 

然後,我會把potensial消息在我的.cpp文件:

#include "foo.h" 

... 

#ifdef OPT_OFF 
#pragma message("DISABLING OPTIMIZATION IN " __FILE__) 
#endif 
+0

糟糕,我知道'__FILE__',但它不能正確地從Foo.cpp轉換到ForceDebug.h ,它報告「ForceDebug.h」而不是「Foo.cpp」 –

+0

我修改了這個問題,以反映我對'__FILE__'的瞭解,但是這並沒有讓我報告Foo.cpp –

+0

反向是一個有趣的解決方案,但也容易出錯,因爲它假定有人會把第二行。 '#include「ForceDebug.h」\ MESSAGE_DEBUG;' –