/ / Sú makrá zaručené bez hlavy? - c ++, c

Sú garantované makrá žiadne nad hlavou? - c ++, c

Ako programátor som sa naučil uprednostňovať kľúčové slovo v rade na makro definície malých funkcií. Viem, že inline je známe, že je bezpečnejší kvôli definíciám makier, ktoré nevykonávajú kontrolu typu, ale hovorím, že inline je len požiadavka, aby kompilátor skutočne nahradil kód, a kompilátor túto požiadavku nemusí akceptovať, takže ma zaujíma, či sú aj žiadosti o makra, alebo je zaručené, že nebudú mať nadčasový čas?

odpovede:

8 pre odpoveď č. 1

Makrá sú nahradenia textov vykonané predtýmkrok kompilácie - nemôžu mať "režijné náklady" tak, ako by mohlo volať funkciu. Stále to nie je dobrý dôvod na použitie makier namiesto funkcií, pretože kompilátory automaticky vložia funkcie aj bez inline kľúčové slovo s povolenou optimalizáciou. Ďalej pomocou optimalizácie času spojenia -flto umožní vloženie medzi TU.


2 pre odpoveď č. 2

Makrá sú veci kompilácie. V kompilovanom kóde sa nikdy nezobrazia ako makra. Ak niečo definujete

#define MyVar 5

A urobíte v kóde:

double y = MyVar*MyVar;

Je to presne ako:

double y = 5*5;

V čase kompilácie MyVar makro je vymeniť o hodnotu, ktorú ste definovali. Za behu nie sú absolútne žiadne režijné náklady.


1 pre odpoveď č. 3

Makrá sú funkciou preprocesora.

Preprocesor modifikuje váš program čisto textovým spôsobom a jeho výsledky môžete skutočne vidieť, ak preprocesor spustíte osobitne.

S GCC môžete urobiť buď gcc -E alebo cpp, Robím to dosť často, keď ladím svoje makrá.

Príklad main.c:

#include <stdio.h>

#define MC_repeat(X)  
for(int _i=0;_i<(X);_i++)

#define rt return

#define MC_xputs(X) if(0>puts(X)) rt -1;


int main()
{
MC_repeat(5)
MC_xputs("hello world");
rt 0;
}

Výstup z gcc -E main.c | tail:

# 2 "main.c" 2
# 11 "main.c"

# 11 "main.c"
int main()
{
for(int _i=0;_i<(5);_i++)
if(0>puts("hello world")) return -1;;
return 0;
}

Keď kompilujete taký zdroj, je to efektívne, akoby ste najprv spustili preprocesor a potom výsledky poslali do vlastného kompilátora.

gcc v skutočnosti tak neurobí (takže získate lepšie chybové správy), môžete ho však prinútiť:

#actually pipes preprocessor output to the compiler proper
gcc -E main.c | gcc -x cpp-output