Qual è il significato di un puntatore a una funzione costante?

I puntatori possono essere dichiarata come puntatore a mutabile (non-const) dati o puntatore a costante di dati.

I puntatori possono essere definiti a punto di una funzione.

I miei collaboratori ed io stavamo discutendo l’uso di “const” con i puntatori e la domanda si avvicinò per quanto riguarda l’uso di const con puntatori a funzione.

Ecco alcune domande:

  1. Qual è il significato di un puntatore a una funzione costante a fronte di un
    puntatore a un non-funzione costante?
  2. Possibile una funzione di const?
  3. Possibile una funzione non-const (mutevole)?
  4. Quale sia il corretto (sicuro) sintassi per il passaggio di un puntatore a funzione?

Edit 1: puntatore a Funzione sintassi

typedef void (*Function_Pointer)(void); //Pointer to void function returning void.

void function_a(Function_Pointer p_func); //Example 1.
void function_b(const Function_Pointer p_func); //Example 2.
void function_c(Function_Pointer const p_func); //Example 3.
void function_d(const Function_Pointer const p_func); //Example 4.

Le dichiarazioni di cui sopra sono esempi di trattamento di un puntatore a funzione come un puntatore di tipo intrinseco.

Dati, variabile o un puntatore di memoria consente di sopra combinazioni.

Quindi le domande sono: può un puntatore a funzione hanno le stesse combinazioni e che cos’è un puntatore const funzione (ad Esempio 2)?



6 Replies
  1. 47

    In C, non c’è nessuna tale cosa come una funzione const o altro, in modo che un puntatore const funzione è privo di senso (non compilare, anche se non ho ancora controllato con qualsiasi compilatore particolare).

    Nota che, per quanto diversi, si può avere un puntatore const a di una funzione, di un puntatore a funzione che restituisce const, etc. Essenzialmente tutto, ma la stessa funzione può essere const. Consideriamo alcuni esempi:

    //normal pointer to function
    int (*func)(int);
    
    //pointer to const function -- not allowed
    int (const *func)(int);
    
    //const pointer to function. Allowed, must be initialized.          
    int (*const func)(int) = some_func;
    
    //Bonus: pointer to function returning pointer to const
    void const *(*func)(int);
    
    //triple bonus: const pointer to function returning pointer to const.
    void const *(*const func)(int) = func.

    Per quanto riguarda il passaggio di un puntatore a una funzione come parametro va, è abbastanza semplice. In genere, si desidera passare un puntatore al tipo corretto. Tuttavia, un puntatore a qualsiasi tipo di funzione può essere convertito in un puntatore a qualche altro tipo di funzione, poi torna al suo tipo originale, e mantenere il valore originale.

    • Perché int (const *func)(int) non è permesso? Il linguaggio di specifica di stato?
    • +1 per mostrare il puntatore a funzione sintassi.
    • TBH, io non sono completamente sicuro che è veramente vietato, ma se è possibile, è sicuramente ignorato (§6.7.3/3: “Le proprietà associate qualificato tipi sono significativi solo per le espressioni che sono lvalues.”)
    • Sembra un const funzione potrebbe essere utile per la dichiarazione di una funzione che, dato lo stesso input, restituisce sempre lo stesso output. il compilatore potrebbe utilizzare, per esempio, per ottimizzare diverse chiamate alla funzione con la stessa costante di ingresso in uno.
    • Il comitato standard sicuramente potrebbe definire const applicato a una funzione, a significare una pura funzione (e sì, che potrebbe essere una cosa utile da fare). Finora, tuttavia, non credo di aver fatto così, o anche dato molto in considerazione la possibilità.
  2. 6

    Secondo il C spec (C99, sezione 6.7.3):

    Le proprietà associate qualificato tipi sono significativi solo per
    espressioni che sono lvalues.

    Quando la spec dice “qualificati tipi”, significa che le cose definito con il const, restrict, ovolatile parola chiave. Seit funzioni non sono lvalues, il const parola chiave su una funzione non è significativo. Si può essere alla ricerca di una sorta di compilatore estensione specifica. Alcuni compilatori genererà un errore se si tenta di dichiarare una funzione come const.

    Sei sicuro che stai guardando un puntatore a una funzione costante e non un puntatore costante per una funzione (che è, è il puntatore che const, non la funzione)?

    Per quanto riguarda #4: vedere questa guida per una utile panoramica di creazione, di passaggio, e l’utilizzo di puntatori a funzione.

    • Sto guardando un puntatore a funzione costante, simile a puntatore a dati costanti.
    • +1 per la citazione e di spiegare i C spec.
  3. 2

    In C, non c’è nessuna tale cosa come un const funzione. const è un tipo di qualifica, e quindi può essere utilizzato solo per definire un tipo, non una funzione. Forse significa un puntatore const a di una funzione o di un non-const puntatore a una funzione?

    In C++, i metodi possono essere const. Se un metodo è const, significa che dopo la chiamata di questo metodo, l’oggetto che contiene il metodo sarà lo stesso stato, come prima è stato chiamato il metodo (nessuna delle variabili di istanza[1] sono stati modificati). Così, si può scegliere un const metodo e un non-const metodo, e quei metodi sono diversi.

    Si può accettare un puntatore a funzione in un elenco di argomenti come retType (*variableName)(arguments).

    [1] a Meno che non sono mutable.

    • Non stiamo parlando di C++ qui.
    • In realtà, in C, le funzioni sono costanti che non possono essere modificati. Intendevo un puntatore a una funzione costante, a seguito di una sintassi simile a un puntatore a dati costanti.
  4. 2

    In C, le funzioni può essere const se sei nel mondo del GCC! Le funzioni possono essere dichiarati const attraverso l’uso di attributi associati alle dichiarazioni di funzioni e di altri simboli. È fondamentalmente utilizzato per fornire informazioni al compilatore di cosa è la funzione, anche se il suo corpo non è disponibile in modo che il compilatore è in grado di fare un qualche tipo di ottimizzazioni con esso.

    Una funzione costante è generalmente definito in termini di una pure funzione.

    Una pura funzione è una funzione con praticamente nessun effetto collaterale. Questo
    significa che pure le funzioni restituiscono un valore che viene calcolato in base
    parametri globali e la memoria, ma non può influenzare il valore di tutti i
    altra variabile globale. Funzioni Pure non può ragionevolmente la mancanza di un ritorno
    tipo (cioè hanno un valore di ritorno void).

    E ora siamo in grado di definire che cosa è un const funzione,

    Una pura funzione che non globali di accesso di memoria, ma solo il suo
    parametri, viene chiamata una funzione costante
    . Questo è perché il
    funzione, essendo estranei allo stato della memoria globale, sempre
    restituire lo stesso valore, dato gli stessi parametri. Il valore di ritorno
    è così derivato direttamente ed esclusivamente dai valori della
    parametri indicati.

    Qui const non implica nulla circa la funzione di mutabilità. Ma è una funzione che non tocca la memoria globale. È possibile assegnare normali puntatori a tali funzioni. Comunque il codice regione, generalmente ( dimenticando se stessi modificando il codice per un po’) be RO e non è possibile modificarlo attraverso il normale puntatore.

    Leggere l’intero perspicace articolo qui.

    Così, quando si tratta di GCC Costante funzioni stiamo parlando di ottimizzazioni e non in funzione di mutabilità.

  5. 0

    1.Qual è il significato di un puntatore a una funzione costante rispetto a un puntatore a un non-funzione costante?

    Non c’è differenza tra const e non-const: la funzione stessa non è modificabile

    Nota: In C++, se la funzione è una funzione membro di una classe, const significa che lo stato dell’oggetto all’interno di questa funzione non può essere modificato (variabili membro assegnato, camere non-const memeber funzioni di chiamata). In questo caso la parola chiave const è parte della funzione membro firma e quindi fa una differenza in termini di il puntatore.

    2.Può una funzione const?

    Vedi sopra.

    3.Può una funzione non-const (mutevole)?

    Vedi sopra

    4.Qual è la (provvisoria) sintassi per il passaggio di un puntatore a funzione?

    Di tutti i puntatori a funzione gratuita e può essere lanciato da qualsiasi altro puntatore a funzione (cioè, la loro dimensione è la stessa). Così si potrebbe definire un tipo per un (ipotetico) funzione: void f(); e convertire tutti i puntatori a funzione di questo tipo di negozio. Nota che non è necessario chiamare la funzione di questo tipo di comune: è necessario eseguire il cast bact originale puntatore-a-tipo di funzione, altrimenti si ottiene un comportamento indefinito (e più probabilità di crash)

    Per C++: puntatori a funzioni membro non sono garantiti per essere convertibile di puntatori a funzioni gratis

  6. 0

    1.
    C’è sintatticamente in nessun luogo a luogo ‘const’ a fare una funzione contenuti costante.

    In ‘funzione non è un valore l’ errore, a prescindere se si dispone di const o non.

    typedef void (* FUNC)(void);
    FUNC pFunc;
    pFunc = 0;     //OK
    *pFunc = 0;    //error:  Cannot assign to a function (a function is not an l-value)
    
    typedef void (* const FUNC)(void);
    FUNC pFunc;
    pFunc = 0;     //error  (const)
    *pFunc = 0;    //error:  Cannot assign to a function (a function is not an l-value)
    
    typedef void (const * FUNC)(void);   //error:  <cv-qualifier>  (lol?)

    2 & 3.
    Puntatori a funzione – sì.. la Funzione di contenuto, non sembra.

    4.
    Io non credo che ci sia alcun modo per fare il passaggio di un puntatore a funzione più sicuro. Con tutti i consts nel mondo, l’unica cosa che si può proteggere è che ‘SetCallback’ possibile modificare la propria copia locale del parametro.

    typedef void (* const FUNC)(void);
    void SetCallback(const FUNC const pCallback)
    {
      FUNC pTemp = pCallback;   //OK  (even though pTemp is not const!!)
      pCallback = 0;            //error  (const)
    }

Lascia un commento