Understanding deferring macro

66 Views Asked by At

I am trying to understand the deferring macro hierarchy. Does this make sense?

// Online C++ compiler to run C++ program online
#include <iostream>
#define EMPTY()
#define EVAL_1(...) __VA_ARGS__
#define EVAL_2(...) EVAL_1(EVAL_1(__VA_ARGS__))

#define DEFER(...) __VA_ARGS__ EMPTY()
#define DEFER2(...) __VA_ARGS__ DEFER(EMPTY) ()
#define DEFER3(...) __VA_ARGS__ DEFER2(EMPTY) ()
#define DEFER4(...) __VA_ARGS__ DEFER3(EMPTY) ()
#define A(x) x

int main() {
    // The parameter is evaluated during expansion.
    std::cout << (EVAL_1(DEFER(A)(5)))<<std::endl; //line 1: evaluate(A (5)) = 5. Output = 5  
    //std::cout << (EVAL_1(DEFER2(A)(5)))<<std::endl; // line 2: evaluate(A EMPTY() (5)) = A(5), Output = error.
    //std::cout << (EVAL_1(DEFER3(A)(5)))<<std::endl; // line 3: evaluate(A EMPTY EMPTY() () (5)) = A EMPTY() (5), Output = error.
    //std::cout << (EVAL_1(DEFER4(A)(5)))<<std::endl; // line 4: evaluate(A EMPTY EMPTY EMPTY() () () (5)) = A EMPTY EMPTY () () (5), Output = error.

    
    std::cout << (EVAL_2(DEFER(A)(5)))<<std::endl; //line 5: evaluate(evaluate(5)) from line 1. Output = 5.
    std::cout << (EVAL_2(DEFER2(A)(5)))<<std::endl;//line 6: evaluate(evaluate(A(5))) = 5. Output =5
    std::cout << (EVAL_2(DEFER3(A)(5)))<<std::endl;//line 7: evaluate(evaluate(A EMPTY() (5)))=5.
    //std::cout <<(EVAL_2(DEFER4(A)(5)))<<std::endl;//line8: error

    return 0;
}

Are there any subtle features that I missed or misunderstood?

0

There are 0 best solutions below