面對在預處理器中是否可以選擇#include
s的問題,我立即認爲不可能。
..後來才發現它確實可行,你只需要注意參數擴展(例如Boost.Preprocessor可以處理)。宏作爲預處理器指令的參數
儘管如果可能的話,我會避免實際做到這一點,但我想知道爲什麼這會起作用。目前,我未能在C++或C標準中得到有用的理解。
參數化宏是否允許用於任何預處理器指令? (除了#define
/#undef
)
有人可以參考這是允許和總結嗎?
實施例:
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/stringize.hpp>
#define INC_LOCAL(a,b) BOOST_PP_STRINGIZE(BOOST_PP_CAT(BOOST_PP_CAT(a,b),.h))
#define INC_GLOBAL(a,b) BOOST_PP_CAT(BOOST_PP_CAT(<,a),BOOST_PP_CAT(b,>))
#include INC_LOCAL(loc,al) // #include "local.h"
#include INC_GLOBAL(vect,or) // #include <vector>
更新: 引用Ç標準,澄清問題。
好吧,'pp-tokens'讓我進入'preprocessing-token',從那裏只有'preprocessing-op-or-punc'看起來不錯,但只給一些操作員。 – 2009-11-15 05:50:46
所以'像普通文本一樣處理'意味着像'identifier(identifier,...)'這樣的宏擴展。 – 2009-11-15 06:17:00
當然。結果可能有未定義的行爲。 – outis 2009-11-15 06:31:43