2013-08-27 20 views
6

typedef int (xxx)(int yyy); oznacza zdefiniowanie funkcji o nazwie xxx z parametrem liczby całkowitej. możesz zobaczyć ten SO post po więcej szczegółów.Funkcja typedef jako parametr innej funkcji

Próbowałem to na różne sposoby, to jest mój kod:

#include<stdio.h> 
#include<stdlib.h> 
typedef int (xxx)(int yyy); 

void f1(xxx a) 
{ 
    printf("f1:%d\n",a); 
} 
void f2(xxx *a) 
{ 
    printf("f2:%d\n",a); 
} 
int test(int y) 
{ 
} 
int main() 
{ 
    xxx *a; 
    f1(test); 
    f1(a); 
    f2(test); 
    f2(a); 

    xxx b; 
    printf("xxx's size:%d\n", sizeof(b)); 
} 

wyjściowa:

f1:4199274 
f1:2 
f2:4199274 
f2:2 
xxx's size:1 

Moje pytanie:

  1. f(xxx a) jest taka sama jak f(xxx *a)?
  2. sizeof(someFunction) jest zdefiniowany czy nie?
+1

Jeśli chodzi o (2), zarówno 'sizeof (function)' jak i 'sizeof (function-type)' są nieprawidłowe. C. Jednakże 'sizeof (function-ptr-type)' jest idealnie w porządku. Musiałbym sprawdzić standard, aby potwierdzić moje podejrzenia dotyczące (1) przed komentarzem dalej. – WhozCraig

Odpowiedz

8

środki zdefiniować funkcję, która o nazwie xxx

Definiuje funkcję typ.

f (xxx a) jest taki sam jak f (xxx * a)?

Tak. Ale to jest hack w języku. Gwiazda jest po prostu pomocna, ponieważ jej brakowało.

sizeof (someFunction) jest zdefiniowany, czy nie?

W szczególności nie jest. Możesz to zrobić w języku asemblerowym lub używając intymnej wiedzy o tym, jak program jest połączony, ale nie ma on znaczenia semantycznego dla C. Funkcje nie muszą być adresowalne poza pośrednimi skokami, ponieważ C obsługuje architektury architektury Harvard. (Należy również pamiętać, że dwie funkcje tego samego typu zwykle mają różne rozmiary, jak wielkość zależy od liczby i charakteru jego instrukcji.)

C11 6.3.2.1/4 mówi

A oznaczenie funkcji jest wyrażeniem mającym typ funkcji. Z wyjątkiem sytuacji, gdy jest operandem operatora sizeof, ... deskryptor funkcji z typem zwracającym typ '' 'jest konwertowany na wyrażenie, które ma typ' 'wskaźnik zwracający typ funkcji' '.

i 6.5.3.4/1 mówi

Operator sizeof nie stosuje się do wyrażenia, które ma typ funkcji ...

Wydaje się, że kompilator nie stosując 6.3 .2.1/4. Komunikat o błędzie jest wymagany.

+0

+1 (i świetny post przez ciebie powiązany w pytaniu OP, również przegłosowany). – WhozCraig

+0

Naprawdę dziękuję ..Ale zastanawiam się, skąd możesz znać tak wiele szczegółów na temat języka C? I odpowiedz na to pytanie (myślę, że to bardzo trudne ...), tak szybko? – Sayakiss

+0

Używam kodu :: blokuje IDE, to: 'mingw32-gcc.exe -c ac -o ao' najpierw, następnie ' mingw32-g ++. Exe -o a.exe " – Sayakiss

Powiązane problemy