2016-04-04 68 views
5

Afaik uintptr_t e intptr_t può essere utilizzato per contenere qualsiasi puntatore su void. Quindi questi tipi possono essere utilizzati per archiviare i puntatori ai dati .Equivalente di uintptr_t/intptr_t per i puntatori alle funzioni?

In C99 o successivo, ci sono tipi di interi con segno e senza segno simili in grado di contenere puntatori alle funzioni?

+0

Non esiste un singolo tipo "puntatore alla funzione" (ogni tipo dipende dal prototipo della funzione). –

+0

No, non ce ne sono. –

+0

Non si può nemmeno convertire un puntatore a funzione in un 'void *'. Anche C e C++ sono lingue diverse. Si prega di limitare la domanda a uno di essi. – Olaf

risposta

7

No, non ce ne sono.

I puntatori di funzione possono essere inoltrati in modo affidabile ad altri tipi di puntatori di funzione (e quindi, solo referenziati mentre si punta al tipo di funzione corretto).

La conversione dei puntatori a funzione di interi in C è incluso 6.3.2.3/6:

Qualsiasi tipo di puntatore può essere convertito in un tipo intero. Ad eccezione di quanto specificato in precedenza, il risultato è definito dall'implementazione. Se il risultato non può essere rappresentato nel tipo intero, il comportamento non è definito. Il risultato non deve essere compreso nell'intervallo di valori di qualsiasi tipo intero.

Si noti che anche se il tipo intero è sufficientemente grande, non è possibile eseguire il cast in intero e tornare al puntatore della funzione per recuperare il puntatore della funzione originale.

In C++, il testo è in [expr.reinterpret.cast] punti 4 e 6. Il comportamento è simile, ma garantisce esplicitamente che se esiste un numero intero di dimensioni sufficienti, quindi convertire il puntatore di funzione in numero intero e viceversa recupera il puntatore della funzione originale.

+1

Giusto per aggiungere che un'implementazione deve specificare il comportamento _implementation defined_. Quindi si dovrebbe essere in grado di trovare se e in che modo tale conversione è valida per un'implementazione specifica. Questo può essere fatto da un ABI, non necessariamente nel compilatore. Una conversione simile potrebbe essere possibile tra 'void *' e un puntatore a funzione (si veda J.5.7). – Olaf

+0

Solo per informare altri lettori: J.5 nello standard C è una sezione sulle estensioni comuni al linguaggio C nell'Allegato J * informativo (non normativo) sui problemi di portabilità. – jotik

+0

È possibile rendere affidabile la conversione: '_Static_assert (sizeof (uintptr_t)> = sizeof (func_pointer_t)," bleh ");'. Quindi tali conversioni falliranno solo su sistemi oscuri in cui i puntatori sono qualcosa di diverso dagli indirizzi (IMO tali sistemi meritano comunque di bloccarsi.) – Lundin