2011-02-02 18 views
10

Cómo declarar un puntero para que funcione en C, para que el puntero sea volátil.C: declarar el puntero volátil a la función

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

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

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

¿Por qué pregunto esto? Leí en http://wiki.answers.com/Q/Volatile_example_code_sample_coding_of_volatile_pointer sobre indicadores volátiles.

A veces hay problemas con punteros volátiles y volátiles puntero a:

Ahora, resulta que los punteros a las variables volátiles son muy comunes. Ambas declaraciones declaran foo sea un puntero a un entero volátil:

volatile int * foo; 
int volatile * foo; 

punteros a las variables volátiles no volátiles son muy raros (creo que los he usado una vez), pero será mejor que vaya por delante y le dará la sintaxis:

int * volatile foo; 

Por lo tanto, quiero obtener un puntero volátil para funcionar no es un puntero a la función "volátil".

Gracias

+4

¿Por qué quiere un puntero volátil para una función? ¿Quién va a cambiar este puntero? ¿Sabes lo que significa 'volátil' _really_? –

+0

@James McNellis, sí, quiero. Este puntero se cambia por el hilo 0 y es utilizado por los hilos 1..7 para iniciar una función.Hay una barrera entre, pero quiero que el compilador limpie este puntero a la memoria en el hilo 0 antes de entrar en una barrera. También quiero que los hilos 1..7 vuelvan a leer este puntero (hay un bucle de '{barrera, lectura de puntero, función de llamada}'). Utilizo un sistema con muchos registros disponibles, por lo que el compilador puede almacenar en caché muchas variables. ¿Estoy en lo cierto? – osgx

+0

Si la barrera está escrita correctamente, el compilador no debe almacenar valores en caché: el 'volátil' no debería ser necesario. – caf

Respuesta

11

pensar en el asterisco como una "barrera". Calificadores (const o volatile) más cerca del nombre de la variable que el asterisco modifique el puntero. Los calificadores más alejados del nombre de la variable que el asterisco modifican a qué se referirá el puntero. En este caso, por lo tanto, tendría que:

static void * volatile f_pointer(void *); 

Excepto, por supuesto, que necesita parens para definir un puntero a una función en lugar de declarar una función que devuelve un puntero:

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

static es una clase de almacenamiento en lugar de un calificador, por lo que el mismo es no verdadero en este caso. Solo puede especificar una clase de almacenamiento para la variable en sí misma, no lo que apunta. No existe un "puntero a extern int" o "puntero a static int", solo "puntero a int". Si especifica una clase de almacenamiento (static o extern), siempre viene primero.

Otros threads han discutido la relación entre la rosca y volatile así que no voy a repetir aquí que más allá de señalar que esta probablemente no será útil.

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

cdecl viene en muy práctico para este tipo de 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> 

Fuente de cdecl: http://cdecl.org/files/cdecl-blocks-2.5.tar.gz

+2

@osgx - Hay una versión en línea en http://cdecl.org/ –

+0

@osgx, incluida en muchos entornos de desarrollo. Parece que recuerdo haber construido el mío desde la fuente, pero no recuerdo dónde lo obtuve. Puede usarlo en línea en http://cdecl.org/. –

+0

Gracias! ¿Puedes nombrar algún IDE, que incluye un cdecl? (Creo que ny IDE con cdecl incluido debe ser muy fácil de usar) – osgx

Cuestiones relacionadas