Question

Je fais un code maintenant et obtenu un certain problème à l'aide de restreindre mot-clé.

typedef int* pt;

int foo(pt a, pt b)
{
 ... /* stuff */
}

Que faire si je veux faire a et b restreint? Le code ci-dessous a échoué:

typedef int* pt;

int foo(pt restrict a, pt restrict b)
{
 ... /* stuff */
}

Merci à l'avance.

Était-ce utile?

La solution

Vous avez besoin d'un « pointeur restreint à l'entier » int * restrict p pas un « pointeur à l'entier restreint » restrict int *p de sorte que vous devrez faire une autre typedef. Vous ne pouvez pas « atteindre l'intérieur de » l'original.

EDIT: Il est vrai que vous ne peuvent pas portée à l'intérieur du typedef et le modificateur appliquera toujours au niveau supérieur, dans ce cas, il se trouve que vous voulez le restrict au niveau supérieur. Il est l'inverse de ce que les gens courent dans habituellement avec const: un moyen de typedef char *char_ptr const char_ptr (ou char_ptr const, ils sont équivalents) à la fois moyenne « pointeur constant char » non « pointeur vers un char constant », qui est ce que les gens veulent. (Voir aussi ce fil SO: C ++ typedef interprétation des pointeurs const )

Donc, dans ce cas, je pense typedef int *pt signifie que des moyens de restrict pt int * restrict pt. Il est assez facile de vérifier car gcc se plaindra « utilisation invalide de« restreindre » pour restrict int *x mais pas pour restrict pt x.

Autres conseils

Assurez-vous de le compiler en utilisant le drapeau C99 pour votre compilateur. Le mot-clé restrict n'existe pas dans C89 C.

Avoir un coup d'œil rapide et la lecture de ce même SO question , le code serait, comme le mot-clé « restreindre » n'est pas mot-clé réservé dans les compilateurs C, comme indiqué par la réponse acceptée dans le linky ci-dessus, soit __restrict ou __restricted__, encore une fois, vérifiez votre compilateur ...

typedef int* __restrict pt;

int foo(pt a, pt b)
{
 ... /* stuff */
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top