MSDN.WhiteKnight - Stack Overflow answers
Ответ на "#define с++ для чего служит"
Answer 917901
Директива
#define
сама по себе осуществляет только текстовую подстановку, но не предвычисление выражений с константами. То есть, если исправить объявление PRIMERF на корректное (у вас пропущена запятая):#define PRIMERF(V1,V2) (V1+2)*(V2+2)
, то на этапе обработки препроцессором
PRIMERF(2,3)
превратится в(2+2)*(3+2)
.Предвычисление константного выражения может быть выполнено на этапе компиляции, но это не гарантируется. Скажем, Visual C++ выполняет его, в том числе и при отключенной оптимизации:
#include <stdio.h> #include <stdlib.h> #define PRIMERP 315 #define PRIMERF(V1,V2)(V1+2)*(V2+2) int main(int argc, char **argv) { int i = PRIMERP; int j = PRIMERF(2,3); printf("%d %d",i,j); ; getchar(); return 0; } /* Disassembly: _main: push ebp mov ebp,esp sub esp,8 push esi mov dword ptr [j],0CCCCCCCCh mov dword ptr [i],0CCCCCCCCh mov dword ptr [i],13Bh // int i = PRIMERP; mov dword ptr [j],14h // int j = PRIMERF(2,3); mov esi,esp mov eax,dword ptr [j] push eax mov ecx,dword ptr [i] push ecx push 0F05858h call dword ptr ds:[0F092C0h] // printf("%d %d",i,j); add esp,0Ch cmp esi,esp call _RTC_CheckEsp (0F01220h) mov esi,esp call dword ptr ds:[0F092C8h] // getchar(); cmp esi,esp call _RTC_CheckEsp (0F01220h) xor eax,eax pop esi add esp,8 cmp ebp,esp call _RTC_CheckEsp (0F01220h) mov esp,ebp pop ebp ret */
14h - это предвычисленное значение выражения (20 в шестнадцатеричном виде)
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.