#define с++ для чего служит

180
22 мая 2019, 08:50

например код:

1) #define PRIMERP 315
2) #define PRIMERF(V1 V2)(V1+2)*(V2+2)
int i = PRIMERP;
int j = PRIMERF(2,3);

хотелось бы уточнить 1 это своего рода константа а 2 это функция то же вроде константы и после компиляции cpp файла в exe файл, эти константы не будут включены в исполняемом файле,то есть если декомпилировать будет следующее

int i = 315;
int j = 20;

я правильно понимаю

Answer 1

Директива #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 в шестнадцатеричном виде)

READ ALSO
undefined reference to `vtable for ClassName&#39;

undefined reference to `vtable for ClassName'

Возникли ошибки при компиляции"qmake" ругается:

149
Исключение при записи данных в массив, состоящий из списков

Исключение при записи данных в массив, состоящий из списков

Разрабатываю программу, которая будет искать нужный элемент при помощи хэш-таблицыХэш-таблицу организую путём создания массива, состоящего...

171