2015-12-12 2 views
-2

Программа C ниже:Почему макросы, подобные функции, оцениваются в нормальном порядке в C?

#define p(x) (printf("%d ", x)) 
#define q(a,b,c) ({int total = a; printf("%d ", b); total += c;}) 
int main(){ 
    q(p(1), 2, p(3)); 
} 

Производит вывод 1 2 3, показывая, что использовали Нормальная оценка заказа. Тем не менее, для обычных функций, такие, как этот фрагмент:

int p(int i){ 
    printf("%d ", i); 
    return i; 
} 

void q(int a, int b, int c){ 
    int total = a; 
    printf("%d ", b); 
    total += c; 
} 
int main(){ 
    q(p(1), 2, p(3)); 
} 

выход 1 3 2, подразумевая, что используется оценка аппликативного порядка. Какова основа для такого поведения? Как аргументы макроса оцениваются по сравнению с функцией?

+0

Почему бы и нет? –

+0

Скомпилировать с помощью '-E', узнать мощность препроцессора. – user3386109

+0

Я не уверен, что 'p (x)', как показано здесь, делает то, что вы думаете. – keshlam

ответ

3

Аргументы макросов полностью расширены до оценки, поэтому компилятор будет оценивать макросы в порядке p, p, q. Однако на данном этапе код фактически не выполняется, а просто расширяется как текст.

Таким образом, ваш первый пример будет расширяться:

int main() { 
    ({int total = (printf("%d", 1); printf("%d", 2); total += printf("%d", 3);}); 
} 

Это компилируется в соответствии с обычными правилами С, как последовательность операторов.

С функциями компилятор генерирует код для каждой функции отдельно, а затем размещает вызовы там, где они используются. Это означает, что он должен знать значение аргументов для q, прежде чем он сможет вызвать q.

Смежные вопросы