簡體   English   中英

在宏中生成包含文件名

[英]Generate include file name in a macro

我正在嘗試在宏中生成包含文件名。 這在C ++中應該是合法的:

#define INCLUDE_FILE "module_impl_win.hpp"
#include INCLUDE_FILE

這工作正常,但是一旦我嘗試生成文件名,它就無法編譯

#define INCLUDE_FILE(M) M##"_impl_win.hpp"
#include INCLUDE_FILE("module")

實際上,它在MSVC2010上給了我警告

警告C4067:預處理指令后出現意外的標記-預期為newlin

但它不包含文件。

問題是什么? 我該如何擺脫呢?

我會使用一個輔助引用宏來做到這一點。 這樣的事情會給你你想要的東西:

#define QUOTEME(M)       #M
#define INCLUDE_FILE(M)  QUOTEME(M##_impl_win.hpp)

#include INCLUDE_FILE(module)

您還可以使用Boost預處理程序,尤其是BOOST_PP_STRINGIZE / BOOST_PP_CAT宏:

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/stringize.hpp>

#define INCLUDE_FILE(M) BOOST_PP_STRINGIZE(BOOST_PP_CAT(M, _impl_win.hpp))

// expands to: #include "module_impl_win.hpp"
#include INCLUDE_FILE(module)

(請參閱C宏-動態#include

請注意,這與@Andrew的答案存在同樣的問題(下划線=保留標識符)。

問題在於最終您的代碼將如下所示:

#include "module""_impl_win.hpp"

這會生成與您看到的相同的警告和錯誤,但是方式略為明顯。

盡管編譯器將接受該語法,但預處理器將不接受。

我沒有建議讓您嘗試做的工作。 個人不希望使用這種類型的宏,因為它使視覺上導航代碼變得更加困難,並且可能會阻止許多編輯器快速導航代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM