2014-03-31 62 views
0
#include <type_traits> 
#include <iostream> 

using namespace std; 

// Expand 
#define PP_EXPAND(X) X 

// Counter Arguments count 
#define PP_ARG_COUNT(...) PP_EXPAND(PP_ARG_POPER(__VA_ARGS__, 5, 4, 3, 2, 1, 0)) 
#define PP_ARG_COUNT2(...) PP_ARG_POPER(__VA_ARGS__, 5, 4, 3, 2, 1, 0) 
#define PP_ARG_POPER(_1, _2, _3, _4, _5, N, ...) N 

int main() 
{ 
    cout << PP_ARG_COUNT(1, 2, int) << endl; 
    cout << PP_ARG_COUNT2(1, 2, int) << endl; 
    cout << PP_ARG_POPER(1, 2, int, 5, 4, 3, 2, 1 0) << endl; 

    return 0; 
} 

我有編制下的Visual Studio 2013的代碼,它輸出:爲什麼這個PP_ARG_COUNT宏需要一個PP_EXPAND?

3 
1 
3 

爲什麼這個宏需要一個PP_EXPAND,並PP_ARG_COUNT2它不能很好地工作?

回答

1

這是解決Visual C++預處理器中的錯誤的解決方法。它在某些情況下無法展開以逗號分隔的令牌序列。

在您的PP_ARG_COUNT2中,當調用PP_ARG_POPER時,__VA_ARGS__被視爲單個參數,從而導致不正確的結果。

此問題最常見的解決方法是引入額外的間接層,強制編譯器重新評估逗號分隔的令牌序列。這裏使用的技術,PP_ARG_COUNT通過EXPAND調用是一種方法,我在an answer to another question中介紹了此技術的一個變體。

相關問題