2010-01-16 20 views
8

Zauważyłem, że czasami C makra są zapisywane jako coś takiego:Więcej informacji na temat `({});` in C?

#define foo(bar) ({ ++bar; }) 

Po kilku eksperymentach, znalazłem, że:

  1. ({}); skompiluje, ale nic nie robią. (Zgodnie z oczekiwaniami)
  2. Pozostawienie wyłączonego ; spowoduje błąd składni. Efektem ubocznym tego jest zapewnienie, że foo() wygląda jak funkcja w kodzie. (Chociaż, jeśli zostanie wyłączony średnik, błąd nie jest zbyt użyteczny do zdiagnozowania problemu!)
  3. return ({}); narzeka, że ​​wartość void nie została zignorowana, tak jakbym próbował użyć funkcji void.

Czy to jest po to, aby programiści dodawali średnik do swoich makr lub czy ma on inny cel? Wypróbowałem Google, ale niestety nie działa z interpunkcja. Czy jest na to nazwa?

Odpowiedz

8

To rozszerzenie GNU o nazwie statement expressions.

Podczas deklarowania makr w standardzie-C często widzisz pętle do...while(0) używane do podobnych celów (np. Tworzenie zakresu bloków). Wyrażenie instrukcji jest lepsze od hackowania pętli, ponieważ może zwrócić wartość. Jeśli chcesz zrobić coś podobnego w standardzie-C, musisz zdefiniować dodatkową funkcję i stracić wygodę określania leksykalnego.

2

() to wyrażenie. ({code; code;}) jest złożoną instrukcją wewnątrz wyrażenia. To jest rozszerzenie GNU C.

http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html

EDIT: wow, mam ten link z Google i nie zauważył, że to dla gcc 2.95 w pierwszej kolejności. Starożytny!

+0

Ancient - ale składnia jest nadal obsługiwana w 4.4.2. –

3

Fajną rzeczą wyrażeń rachunku (jeśli nie jest to fajne) jest to, że ostatnie stwierdzenie jest wynikiem wyrażenia.

#define foo(bar) ({ ++bar; 3.1415927; }) 

int i = 0; 
float pi = foo(i); 
Powiązane problemy