«C'est que je peux compiler le fichier source en mode C89 » - simple raison: restrict
est pas un mot-clé réservé jusqu'à C99 see forword of C11 (C99 est la 2ème édition), il sera simplement utilisé comme un nom, ce qui est ignoré dans le prototype.
Mais les deux déclarateurs de fonctions (prototype et définition) doivent spécifier le même type, c'est-à-dire que restrict
est requis dans les deux.
Vous devez compiler l'en-tête et l'implémentation avec la version C correcte. Pour restrict
, la définition est généralement plus pertinente que le prototype, mais le compilateur peut être en mesure de détecter les violations dans l'appelant. Supposons toujours que vous vous fiez à de tels hacks pour casser votre code.
Après les commentaires, en essayant un peu de voyance:
Si vous voulez faire le code de compilation avec l'ancien C90, encore tirer parti des nouvelles fonctionnalités lorsque cela est utile, vous pouvez utiliser une macro:
#if this_is_c99_or_c11
#define RESTRICT retrict
#else
#define RESTRICT
#endif
void f(int * RESTRICT p);
...
void f(int * RESTRICT p)
{
...
}
Rappelez-vous qu'il peut y avoir des problèmes de compilation de l'appelant et de l'appelé. Vérifiez l'ABI de votre cible.
Si vous avez une macro conditionnelle, pourquoi essayez-vous même de faire une définition couvrant les deux cas? La façon «correcte» de traiter de tels scénarios est soit de fournir deux déclarations, de les séparer par le garde de macro, soit de masquer le mot-clé problématique sous un identifiant de macro, lui-même donné différentes définitions par le garde. – Leushenko