2011-02-02 23 views
10

Come dichiarare un puntatore a funzionare in C, in modo che il puntatore stesso sia volatile.C: Dichiara il puntatore volatile alla funzione

static void volatile (* f_pointer)(void*); 

static void (volatile * f_pointer)(void*); 

static void (* volatile f_pointer)(void*); 

Perché chiedo questo? Ho letto su http://wiki.answers.com/Q/Volatile_example_code_sample_coding_of_volatile_pointer su puntatori volatili.

a volte ci sono problemi con i puntatori volatili e puntatore a volatile:

Ora, si scopre che i puntatori ai variabili volatili sono molto comuni. Entrambe queste dichiarazioni dichiarano foo ad essere un puntatore a un intero volatile:

volatile int * foo; 
int volatile * foo; 

puntatori volatile per variabili non volatili sono molto rare (penso che li ho usato una volta), ma meglio che vada avanti e che vi dia la sintassi:

int * volatile foo; 

Quindi, voglio ottenere un puntatore volatile per funzionare non un a funzione "volatile" puntatore.

Grazie

+4

Perché si desidera un puntatore volatile a una funzione? Chi cambierà questo puntatore? Sai cosa significa "volatile" _really_? –

+0

@James McNellis, Sì, lo voglio. Questo puntatore viene modificato dal thread 0 e utilizzato dai thread 1..7 per avviare una funzione.C'è una barriera tra, ma voglio che il compilatore scarichi questo puntatore sulla memoria nella thread 0 prima di entrare in una barriera. Inoltre voglio che i thread 1..7 rileggano questo puntatore (c'è un ciclo di '{barrier, pointer read, calling function}'). Uso un sistema con molti registri disponibili, quindi il compilatore può memorizzare molte variabili. Ho ragione? – osgx

+0

Se la barriera è scritta correttamente, il compilatore non deve memorizzare valori di cache su di esso - il 'volatile 'non dovrebbe essere necessario. – caf

risposta

11

pensare alla asterisco come una "barriera". Qualificatori (const o volatile) più vicini al nome della variabile rispetto all'asterisco modificano il puntatore stesso. I qualificatori più lontani dal nome della variabile rispetto all'asterisco modificano a cosa si riferirà il puntatore. In questo caso, quindi, si avrebbe:

static void * volatile f_pointer(void *); 

Tranne, naturalmente, che è necessario parentesi per definire un puntatore a una funzione invece di dichiarare una funzione che restituisce un puntatore:

static void (*volatile f_pointer)(void *); 

static è una classe di archiviazione piuttosto che un qualificatore, quindi lo stesso è non true nel suo caso. È possibile specificare solo una classe di memoria per la variabile stessa, non per quello a cui punta. Non esiste un "puntatore a extern int" o "puntatore a static int", solo "puntatore a int". Se si specifica una classe di memoria (static o extern), viene sempre prima.

Altro threads hanno discusso il rapporto tra filettatura e volatile quindi non voglio ripetere che qui al di là di notare che questo probabilmente non sarà utile.

6
static void (* volatile f_pointer)(void*); 
9

cdecl proviene davvero utile per questo tipo di problema:

$ cdecl 
Type `help' or `?' for help 
cdecl> declare f_pointer as static volatile pointer to function(pointer to void) returning void 
static void (* volatile f_pointer)(void *) 
cdecl> 

Fonte di cdecl: http://cdecl.org/files/cdecl-blocks-2.5.tar.gz

+2

@osgx - C'è una versione online su http://cdecl.org/ –

+0

@osgx, è inclusa in molti ambienti di sviluppo. Mi sembra di ricordare di costruire il mio dalla fonte, ma non ricordo dove l'ho preso. Puoi usarlo online su http://cdecl.org/. –

+0

Grazie! Puoi nominare qualche IDE, che include un cdecl? (Penso che ny IDE con cdecl incluso deve essere molto user-friendly) – osgx

Problemi correlati