Prototipi di funzioniFunction Prototypes

Una dichiarazione di funzione precede la definizione di funzione e specifica il nome, il tipo restituito, la classe di archiviazione e altri attributi di una funzione.A function declaration precedes the function definition and specifies the name, return type, storage class, and other attributes of a function. Per essere un prototipo, la dichiarazione della funzione deve inoltre stabilire i tipi e gli identificatori per gli argomenti della funzione.To be a prototype, the function declaration must also establish types and identifiers for the function's arguments.

SintassiSyntax

declaration:declaration:
declaration-specifiers attribute-seq optinit-declarator-list opt ;declaration-specifiers attribute-seq optinit-declarator-list opt ;

/* attribute-seq opt è specifico di Microsoft //* *attribute-seq opt is Microsoft Specific */

declaration-specifiers:declaration-specifiers:
storage-class-specifier declaration-specifiers optstorage-class-specifier declaration-specifiers opt

type-specifier declaration-specifiers opttype-specifier declaration-specifiers opt

type-qualifier declaration-specifiers opttype-qualifier declaration-specifiers opt

init-declarator-list:init-declarator-list:
init-declaratorinit-declarator

init-declarator-list , init-declaratorinit-declarator-list , init-declarator

init-declarator:init-declarator:
declaratordeclarator

declarator = initializerdeclarator = initializer

declarator:declarator:
pointer optdirect-declaratorpointer optdirect-declarator

direct-declarator: /* Dichiaratore di funzione */direct-declarator: /* A function declarator */
direct-declarator ( parameter-type-list ) /* Dichiaratore nuovo stile */direct-declarator ( parameter-type-list ) /* New-style declarator */

direct-declarator ( identifier-list opt ) /* Dichiaratore stile obsoleto */direct-declarator ( identifier-list opt ) /* Obsolete-style declarator */

Il prototipo ha lo stesso form della definizione di funzione, ma viene terminato da un punto e virgola immediatamente dopo la parentesi di chiusura e pertanto non ha corpo.The prototype has the same form as the function definition, except that it is terminated by a semicolon immediately following the closing parenthesis and therefore has no body. In entrambi i casi, il tipo restituito deve corrispondere al tipo restituito specificato nella definizione di funzione.In either case, the return type must agree with the return type specified in the function definition.

I prototipi di funzione hanno gli utilizzi importanti elencati di seguito:Function prototypes have the following important uses:

  • Stabiliscono il tipo restituito per funzioni che restituiscono tipi diversi da int.They establish the return type for functions that return types other than int. Sebbene le funzioni che restituiscono valori int non richiedano prototipi, i prototipi sono consigliati.Although functions that return int values do not require prototypes, prototypes are recommended.

  • Senza prototipi completi, le conversioni standard vengono effettuate, ma non viene eseguito alcun tentativo di controllare il tipo o il numero di argomenti con il numero di parametri.Without complete prototypes, standard conversions are made, but no attempt is made to check the type or number of arguments with the number of parameters.

  • I prototipi sono utilizzati per inizializzare i puntatori a funzioni prima che quelle funzioni vengano definite.Prototypes are used to initialize pointers to functions before those functions are defined.

  • L'elenco di parametri viene utilizzato per controllare la corrispondenza degli argomenti nella chiamata di funzione con i parametri nella definizione di funzione.The parameter list is used for checking the correspondence of arguments in the function call with the parameters in the function definition.

    Il tipo convertito di ogni parametro determina l'interpretazione degli argomenti che la chiamata di funzione inserisce nello stack.The converted type of each parameter determines the interpretation of the arguments that the function call places on the stack. Un tipo non corrispondente tra un argomento e un parametro può determinare che gli argomenti nello stack siano interpretati erroneamente.A type mismatch between an argument and a parameter may cause the arguments on the stack to be misinterpreted. Se ad esempio in un computer a 16 bit un puntatore a 16 bit viene passato come argomento, quindi dichiarato come parametro long, i primi 32 bit dello stack sono interpretati come parametro long.For example, on a 16-bit computer, if a 16-bit pointer is passed as an argument, then declared as a long parameter, the first 32 bits on the stack are interpreted as a long parameter. Questo errore crea problemi non solo con il parametro long, ma anche con tutti i parametri che lo seguono.This error creates problems not only with the long parameter, but with any parameters that follow it. È possibile rilevare errori di questo tipo dichiarando prototipi di funzione completi per tutte le funzioni.You can detect errors of this kind by declaring complete function prototypes for all functions.

    Un prototipo stabilisce gli attributi di una funzione in modo da poter controllare le chiamate alla funzione che precede la relativa definizione (o che si verifica in altri file di origine) per l'eventuale presenza di tipi restituiti e tipi di argomento non corrispondenti.A prototype establishes the attributes of a function so that calls to the function that precede its definition (or occur in other source files) can be checked for argument-type and return-type mismatches. Se ad esempio se si specifica l'identificatore di classe di archiviazione static in un prototipo, è necessario specificare anche la classe di archiviazione static nella definizione di funzione.For example, if you specify the static storage-class specifier in a prototype, you must also specify the static storage class in the function definition.

    Le dichiarazioni di parametro complete (int a) possono essere combinate con dichiaratori astratti (int) nella stessa dichiarazione.Complete parameter declarations (int a) can be mixed with abstract declarators (int) in the same declaration. Ad esempio, la seguente dichiarazione è valida:For example, the following declaration is legal:

int add( int a, int );  

Il prototipo può includere sia il tipo che un identificatore per ogni espressione passata come argomento.The prototype can include both the type of, and an identifier for, each expression that is passed as an argument. Tuttavia, tali identificatori hanno un ambito di validità solo fino alla fine della dichiarazione.However, such identifiers have scope only until the end of the declaration. Il prototipo può inoltre riflettere il fatto che il numero di argomenti sia variabile o che nessun argomento sia passato.The prototype can also reflect the fact that the number of arguments is variable, or that no arguments are passed. Senza tale elenco, le mancate corrispondenze non possono essere rivelate né il compilatore può generare messaggi diagnostici relativi.Without such a list, mismatches may not be revealed, so the compiler cannot generate diagnostic messages concerning them. Per altre informazioni sul controllo del tipo, vedere Argomenti.See Arguments for more information on type checking.

L'ambito del prototipo nel compilatore C di Microsoft è adesso compatibile con ANSI durante la compilazione con l'opzione del compilatore /Za.Prototype scope in the Microsoft C compiler is now ANSI-compliant when compiling with the /Za compiler option. Ciò significa che se si dichiara un tag struct o union all'interno di un prototipo, il tag viene inserito in quell'ambito anziché in ambito globale.This means that if you declare a struct or union tag within a prototype, the tag is entered at that scope rather than at global scope. Ad esempio durante la compilazione con /Za per compatibilità con ANSI, non è mai possibile chiamare questa funzione senza causare un errore di mancata corrispondenza tra i tipi:For example, when compiling with /Za for ANSI compliance, you can never call this function without getting a type mismatch error:

void func1( struct S * );  

Per correggere il codice, definire o dichiarare struct o union in ambito globale prima del prototipo di funzione:To correct your code, define or declare the struct or union at global scope before the function prototype:

struct S;  
void func1( struct S * );  

In /Ze, il tag viene ancora inserito in ambito globale.Under /Ze, the tag is still entered at global scope.

Vedere ancheSee Also

FunzioniFunctions