2013-08-27 38 views
6

typedef int (xxx)(int yyy); significa definire una funzione denominata xxx con un parametro intero. puoi vedere questo SO post per i dettagli.Una funzione typedef come parametro di un'altra funzione

Ho provato questo in modi diversi, che è il mio codice:

#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)); 
} 

uscita:

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

La mia domanda:

  1. f(xxx a) è lo stesso di f(xxx *a)?
  2. sizeof(someFunction) è definito o no?
+1

Riguardo a (2), sia 'sizeof (funzione)' che 'sizeof (funzione-tipo)' non sono validi è C. Tuttavia, 'sizeof (function-ptr-type)' è perfettamente a posto. Dovrei controllare lo standard per confermare i miei sospetti su (1) prima di commentare ulteriormente. – WhozCraig

risposta

8

mezzi definiscono una funzione che ha chiamato xxx

Esso definisce una funzione tipo.

f (xxx a) è uguale a f (xxx * a)?

Sì. Ma è una specie di hack nella lingua. La stella è stata semplicemente aggiunta per te perché mancava.

sizeof (someFunction) è definito o no?

In particolare non lo è. Puoi farlo in un linguaggio assembly o usando una conoscenza intima di come il tuo programma è collegato, ma non ha alcun significato semantico per C. Le funzioni non hanno nemmeno bisogno di essere indirizzabili al di là di salti indiretti, dato che C supporta le macchine dell'architettura di Harvard. (Si noti inoltre che due funzioni con lo stesso tipo di solito hanno dimensioni diverse, come la dimensione è determinata dal numero e la natura delle sue istruzioni.)

C11 6.3.2.1/4 dice

A la designazione della funzione è un'espressione che ha un tipo di funzione. Tranne quando è l'operando dell'operatore sizeof, ... una designazione di funzione con tipo '' function return type '' viene convertita in un'espressione che ha il tipo '' puntatore alla funzione che restituisce il tipo ''.

e 6.5.3.4/1 dice

L'operatore sizeof non si applica ad un'espressione che ha tipo di funzione ...

Sembra che il compilatore non riesce ad applicare 6.3 .2.1/4. È richiesto un messaggio di errore

+0

+1 (e ottimo post da te collegato nella domanda dell'OP, anche up-votato). – WhozCraig

+0

Davvero grazie ..Ma mi chiedo, come hai potuto sapere tanti dettagli sul linguaggio C? E rispondi a questa domanda (penso che sia molto difficile ..) così velocemente? – Sayakiss

+0

Io uso codice :: blocchi IDE, lo faccio: 'mingw32-gcc.exe -c ac -o ao' prima, poi ' mingw32-g ++. Exe -o a.exe ao' – Sayakiss

Problemi correlati