2016-09-24 89 views
0

撇開最佳做法,是否可以製作一個C++預處理器宏,該宏會生成一個有效的#include語句,以後會導致文件被包含在內?如何使用C++宏預處理器生成有效的include語句?

#define MY_INCLUDE magic_goes_here 

MY_INCLUDE 
//This would be substituted with #include "somefile.h" and then later evaluated to include that file 

使用案例

既然你可能會想,這是我的使用情況:

我想跟着DRY principle,只有指定的OpenGL版本並在我的代碼中使用ONCE的配置文件。不幸的是,我的平臺(Qt5)不能將OpenGL版本和配置文件指定爲變量,因此我使用宏來確保正確的類被重載,正確的參數被傳遞給所有需要設置的樣板代碼Qt5中的OpenGL。

然而頭疼的最後一個位仍然是:

#include <QOpenGLFunctions_4_0_Core> 

在這種情況下,我想替代4,將0Core與宏。

那麼我該如何做到這一點?

+0

你不能。 :(... –

+0

其實只是在發佈這個後,我做到了!但只爲「」而不是「>」 –

+0

雖然你不能這樣,你可以隔離困擾包括在你自己的頭文件(說'ogl -in-use.h')並且使用你的所有代碼如果你需要用另一個版本替換版本,那麼有一個地方可以調整 –

回答

0

考慮在包含特定標頭之前使用__has_include
這將允許您基於標題的可用性進行功能測試。

例子:

#if __has_include(<QOpenGLFunctions_4_0_Core>) 
# include <QOpenGLFunctions_4_0_Core> 
# define using_GL_4 1 
#elif __has_include(<QOpenGLFunctions_3_0_Core>) 
# include <QOpenGLFunctions_3_0_Core> 
# define using_GL_3 1 
#endif 

然後,您可以使用您定義的宏知道已被列入什麼版本的GL的。

如果您想根據其他宏有條件地包含文件,您將別無選擇,只能解釋每個條件並使用#if/#elif鏈。您無法構建標題名稱並在預處理過程中包含它。

+0

這個標準有什麼用處? –