funkcja inline vs funkcja makro [duplikat]

Możliwy duplikat:
funkcje Inline vs makra preprocesora

Chcę poznać różnicę między funkcją inline i funkcją makra.

1) czy funkcja inline jest taka sama jak funkcja makra ?

2) wiem, że oba nie są wywoływane, ale są zastępowane przez jego kod w fazie kompilacji. nie?

3) jeśli jest różnica, możesz ją określić?

Author: Community, 2012-11-14

4 answers

Inline zastępuje wywołanie funkcji ciałem funkcji, jednak inline jest tylko żądaniem do kompilatora, które można zignorować (można przekazać pewne flagi do kompilatora, aby wymusić inline lub użyć atrybutu always_inline z gcc).

Z drugiej strony makro jest rozszerzane przez preprocesor przed kompilacją, więc jest to tak jak zastępowanie tekstu, również makra nie są sprawdzane typu, funkcje wbudowane są. Jest porównanie w wiki .

Ze względu na kompletność, nadal możesz mieć pewien rodzaj bezpieczeństwa typu z makrami, używając na przykład __typeof__ gcc, następujące generują prawie identyczny kod i oba powodują ostrzeżenia, jeśli są używane z niewłaściwymi typami:

#define max(a,b) \
  ({ __typeof__ (a) _a = (a); \
      __typeof__ (b) _b = (b); \
    _a > _b ? _a : _b; })

__attribute__((always_inline)) int max(int a, int b) {
   return (a > b ? a : b);
}

Uwaga: czasami makra bez liter są po prostu tym, co jest potrzebne, na przykład, spójrz na to, jak uthash używa makr, aby dowolna struktura C była hashable bez uciekania się do odlewów.

 23
Author: iabdalkader,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-14 10:43:01

1) nie.

2) makro w C jest po prostu tekstem, który jest rozszerzany przed kompilator przetwarza kod źródłowy. Słowo kluczowe inline jest używane jako wskazówka dla kompilatora, że funkcja może być umieszczona w linii bez potrzeby ustawiania stosu wywołań.

Na przykład, powiedzmy, że masz następujące dwa fragmenty kodu (najpierw makro, a następnie funkcja wbudowana):

#define MAX(x,y)     (x > y ? x : y)

I

inline int max(int x, int y) { return x > y ? x : y; }

Gdy preprocesor znajdzie następujące wywołanie w Twój kod:

int highest = MAX (var_1, var_2);

Zastępuje go

int highest = (var_1 > var_2 ? var_1 : var_2);

Powyższe jest tym, co kompilator ostatecznie otrzymuje podczas procesu kompilacji, stąd fragment zdefiniowany przez MAX (x,y) jest zamiennikiem dla MAX(var_1, var_2). Gdy kompilator znajdzie wywołanie funkcji

int highest = max (var_1, var_2);

Wtedy zostanie wywołana funkcja "max". Musisz założyć, że zostanie wywołana w normalny sposób, ponieważ kompilator może zignorować podpowiedź "inline" i wykonać połączenia do funkcji przejść przez normalną call-stack zamiast po prostu umieszczać kod dla funkcji w miejscu, w którym jest napotkana.

Ostatnie zastrzeżenie z makrami: ponieważ jest to wymiana tekstu, a nie wymiana kodu, jeśli zrobisz coś takiego:

int highest = MAX (v1++, v2++);

Preprocesor rozszerzy to do:

int highest = (v1++ > v2++ ? v1++ : v2++);
Co prawdopodobnie nie jest tym, co zamierzałeś.
 18
Author: Lelanthran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-14 09:04:29

Makra są deklaracjami, które są zastępowane przez preprocesor (przed rzeczywistą kompilacją ). Zanim rozpocznie się faza kompilacji , makra już dawno zniknęły, a jedyne, co pozostało, to ich rozszerzenia (w tym rozszerzenie do niczego).

Funkcje Inline są w rzeczywistości funkcjami zgodnymi z językiem , z regułami zakresu, deklaracjami zmiennych, konstrukcjami logicznymi (pętlami, itp.) i tak dalej. Funkcja wbudowana nie jest rozszerzana pre-compile-krok jak makra. Są one skompilowane tak jak zwykły kod, ale mogą być następnie wtryskiwane (z braku lepszego terminu) do skompilowanego kodu i optymalizowane w razie potrzeby.

 6
Author: WhozCraig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-14 08:40:47

No inline nie jest tym samym co macro Definicja, ponieważ makro jest wstępnie przetwarzane, ale inline jest tylko wskazaniem dla kompilatora, aby umieścić całe ciało funkcji tam, gdzie jest wywoływana.

Umieszczenie słowa kluczowego inline przed dowolną definicją funkcji jest tylko wskazaniem lub żądaniem , kompilator może dowolnie wybrać, czy chce uczynić tę funkcję inline, czy zostawić ją jako normalną

Podstawienie makra: preprocessing phase (tj. przed kompilacją)

-- plik wejściowy test.c plik wynikowy w Linuksie test.i

Inline substitution: compilation phase

 1
Author: Omkant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-14 08:38:33