C restringir con typedef
-
09-10-2019 - |
Pregunta
que estoy haciendo ahora algo de código y de algunos problemas usando restringir la palabra clave.
typedef int* pt;
int foo(pt a, pt b)
{
... /* stuff */
}
¿Qué pasa si quiero hacer a y b restringido? El código de abajo fallado:
typedef int* pt;
int foo(pt restrict a, pt restrict b)
{
... /* stuff */
}
Gracias de antemano.
Solución
Se necesita un "puntero restringido al número entero" int * restrict p
no un "puntero al número entero restringido" restrict int *p
por lo que tendrá que hacer otro typedef. No se puede "dentro de alcance" la original.
EDIT: Si bien es cierto que no puede alcance dentro de la typedef y el modificador se aplique siempre en el nivel superior, en este caso resulta que desea el restrict
en el nivel superior. Es la inversa de lo que la gente suele topan con const
: medios typedef char *char_ptr
const char_ptr
(o char_ptr const
, son equivalentes) ambos significan "puntero constante a char" no "puntero a Char constante" que es lo que la gente quiere. (Véase también este hilo SO: C ++ typedef interpretación de punteros const )
Así que en este caso creo que typedef int *pt
sí significa que los medios restrict pt
int * restrict pt
. Es bastante fácil de verificar porque gcc se quejará de "uso inválido de 'restringir'" para restrict int *x
pero no para restrict pt x
.
Otros consejos
Asegúrese de que está utilizando la compilación la bandera C99 para su compilador. La palabra clave restrict
no existe en C89 C.
Tener una mirada rápida y leyendo esto similar SO pregunta , el código sería, como la palabra clave 'restringir' no es la palabra clave reservada en los compiladores de C ++, como lo indica la respuesta aceptada en el Linky anteriormente, ya sea __restrict
o __restricted__
, de nuevo, compruebe su compilador ...
typedef int* __restrict pt;
int foo(pt a, pt b)
{
... /* stuff */
}