Makra a funkcje statyczne w nagłówku

9

do wielu szybkich zadań, w których można zastosować funkcję f(x,y), w zwykłym C używane są makra. Chciałbym zapytać konkretnie o te przypadki, które można rozwiązać za pomocą wywołania funkcji (tj. Makra używane do wstawiania funkcji, a nie do rozszerzania kodu dowolnego kodu).

Zazwyczaj funkcje C nie są wstawiane, ponieważ mogą być połączone z innymi plikami C. Jednak statyczne funkcje C są widoczne tylko z pliku C, w którym są zdefiniowane. Dlatego mogą być wstawiane przez kompilatory. Słyszałem, że wiele makr należy zastąpić, zamieniając je w funkcje statyczne, ponieważ zapewnia to bezpieczniejszy kod.

Czy istnieją przypadki, w których nie jest to dobry pomysł?

Znowu: Nie pytam o makra do produkcji kodu z podobnymi konstrukcjami ##, których w ogóle nie można wyrazić jako funkcję.

wirrbel
źródło
4
Myślę, że na twoje pytanie można było odpowiedzieć tutaj stackoverflow.com/questions/9104568/macro-vs-function-in-c i tutaj stackoverflow.com/questions/1358232/why-use-macros-in-c
Maru
pisanie odpowiedniego makra jest uciążliwe, a inlinefunkcje ing zapewniają, że można go zdefiniować wiele razy w pliku binarnym, kompilator może zdecydować, czy faktycznie wstawi to, by zaoszczędzić miejsce
maniak ratchet,
2
Podejrzewałbym, że większość z nich ma przyczyny historyczne. Przed laty kompilatory C w ogóle nie wstawiały funkcji. Ludzie używali makr do rzeczy, które chcieli wprowadzić. Kod C jest zwykle niezwykle długowieczny.
Jan Hudec
@ratchetfreak: C nie ma inline, nie chodzi o C ++.
wirrbel 18.10.13
2
@wirrbel Oczywiście jest inlinew C, przynajmniej od C99. Szybki przegląd znajduje się w Wikipedii na temat funkcji wbudowanych .
amon,

Odpowiedzi:

6

Makra, które można rozwiązać za pomocą wywołania funkcji, mają wiele pułapek:

  • Są trudne do napisania, ponieważ być może będziesz musiał poprawnie obsługiwać takie argumenty jak ++i.
  • Trudno je debugować za pomocą wizualnego debuggera, ponieważ nie można przejść przez makro ani umieścić w nim punktu przerwania.
  • Trudno sobie z nimi poradzić poprawnie, analizując zależności kompilacji.

Makra, które można rozwiązać za pomocą wywołania funkcji, mogą być przydatne do zapewnienia wstawiania w prymitywnym kompilatorze. Nie znam żadnego kompilatora, który nie obsługuje funkcji wbudowanych, a niektóre z nich mogą nawet wbudować się we wszystkie jednostki kompilacyjne.

Zazwyczaj funkcje C nie są wstawiane, ponieważ mogą być połączone z innymi plikami C.

Nie ma powodu, dla którego kompilator nie byłby w stanie dostarczyć dwóch wersji funkcji, tradycyjnej edycji calli inlinejednej. Powinieneś spojrzeć na dokumentację kompilatora, na który celujesz. Możesz także spojrzeć na wygenerowany zestaw: nawet jeśli nie znasz zestawu, możesz szybko nauczyć się mówić, czy jakaś funkcja została wstawiona, czy nie. (Zacznij od przykładów dla dzieci, aby szybko się tego nauczyć.)

użytkownik40989
źródło