3 votes

le passage de l'argument 1 de 'func' élimine le qualificatif 'restrict' du type cible du pointeur

Pourquoi n'est-il pas permis de rejeter restrict dans ce cas ?

void func(double * const *q) {
    q[0][0] = 10.0;
}

int main(void) {
    double a = 5.0;
    double * restrict p = &a;
    double * restrict const *q = &p;

    // GCC: warning: passing argument 1 of 'func' discards 'restrict' qualifier
    // from pointer target type [-Werror=discarded-qualifiers]
    func(q);

    return 0;
}

L'erreur ne semble pas intuitive car un pointeur restrictif peut être casté vers un pointeur non restrictif, et ici avec une balise const Je m'assure que func ne peut pas remplacer p avec un pointeur non restreint.

0voto

Lundin Points 21616

La règle générale pour tous les qualificatifs de type est que vous pouvez convertir implicitement et en toute sécurité un pointeur en type en un pointeur qualifié en type. Ceci est garanti par 6.3.2.3 ainsi que par les règles d'affectation simple 6.5.16.1 (qui s'appliquent lors du passage de paramètres). Il en va de même pour tous les qualificateurs : const , volatile , restrict y _Atomic .

Cela ne veut pas dire que vous pouvez faire l'inverse. Vous ne pouvez jamais abandonner un qualificatif implicitement, vous devez utiliser un cast explicite. Et lorsque vous le faites, vous invoquez un comportement défini par l'implémentation.

Dans ce cas, le plâtre est parfaitement sûr : func((double*const *)q); .

Notamment, restrict est le plus utile lorsqu'il est utilisé sur des paramètres de fonction et que vous appelez ces fonctions depuis une autre unité de traduction. Pour utiliser restrict dans une portée locale n'est probablement pas très significative, car le compilateur peut facilement déduire si les variables impliquées dans une expression pointent à des adresses différentes ou à la même.

Globalement, il s'agit d'un "contrat" entre le programmeur et le compilateur, dans lequel le programmeur promet de ne pas accéder aux données pointées par le biais d'une autre variable. Le programmeur peut cependant facilement rompre ce contrat en rejetant la variable restrict et tout peut arriver.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X