0
這裏的目標是簡單得到a
,b
,c
而不是他們的實際值。該設置是「很簡單」:防止意外的宏重新擴展與提升?
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/stringize.hpp>
#include <iostream>
// Define "invalid" sequence first
#define SEQ (a)(b)(c)
// Try to create "final" value with `std::string("elem")`
// Brought in for explicit `std::string`, but no dice
#define MAKE_XSTRING(x) MAKE_STRING(x)
#define MAKE_STRING(x) std::string(#x)
// oh, the humanity! vvvvvvvvvvvv or BOOST_PP_STRINGIZE
#define HUMANIZE(r, data, elem) (MAKE_XSTRING(elem))
#define SEQ_HUMAN BOOST_PP_SEQ_FOR_EACH(HUMANIZE,,SEQ)
所以我很期待在這一點上我有什麼:一個新的序列與(std::string("a"))
等:
// confirmation: vvvvvvvvvvvvvvvv
// warning: Humans: (std::string("a")) (std::string("b")) (std::string("c"))
#pragma message "Humans: " BOOST_PP_STRINGIZE(SEQ_HUMAN)
思考我這樣很聰明並以某些明確的字符串取得我的值,現在我定義「真實」代碼所需的實際值。
// Now that we have the "final" values, actually define the real values
// in real code, it's some lengthy nested namespaces (inconvenient to type)
#define a 123
#define b 456
#define c 789
而終於,讓打印出來,以確保它們不展開:
// Let there be printing!
#define GOTTA_PRINT_EM_ALL(r,data,i,elem) << ((i)+1) << ". " << elem << std::endl
int main(int argc, const char **argv) {
std::cout << "Humans: " << std::endl
BOOST_PP_SEQ_FOR_EACH_I(GOTTA_PRINT_EM_ALL,,SEQ_HUMAN);
}
不過好像外星人確實接管:
Humans:
1. 123
2. 456
3. 789
鑑於他們應該是std::string("a")
......真正的價值是如何回到那裏的?我認爲std::string
構造函數中的("a")
可能會產生問題,但似乎並不如此(BOOST_PP_STRINGIZE
結果相同)。有什麼建議麼?
我現在知道這是不是你想要什麼問。我會在這裏稍微留下這個「答案」,這樣你就可以澄清問題。我現在明白了,但並不十分清楚。創建一個不包含任何解釋的_self-contained_示例程序。 – sehe
使用鏈接重複問題的答案:http://coliru.stacked-crooked.com/a/5405ce9f8218092f – sehe
嗨@sehe感謝您解釋它並將我鏈接到我無法找到的問題。這一切現在變得更有意義了,我想我並沒有真正意識到引號在使用之前會被轉義 – sjm324