Maison > développement back-end > C++ > Pourquoi est-ce que j'obtiens une erreur de liaison lors de la définition de membres entiers statiques const dans une classe C ?

Pourquoi est-ce que j'obtiens une erreur de liaison lors de la définition de membres entiers statiques const dans une classe C ?

Linda Hamilton
Libérer: 2024-12-01 13:14:09
original
239 Les gens l'ont consulté

Why Do I Get a Linker Error When Defining Static Const Integer Members in a C   Class?

Erreur de liaison lors de la définition de membres entiers const statiques dans la définition de classe

Les déclarations de classe en C permettent la définition de membres entiers const statiques dans le classe. Cependant, les utilisateurs peuvent rencontrer des erreurs de l'éditeur de liens avec un code similaire à l'exemple fourni :

class test {
public:
    static const int N = 10;
};

int main() {
    std::cout << test::N << "\n";
    std::min(9, test::N);
}
Copier après la connexion

Bien que le compilateur accepte la définition de classe, l'éditeur de liens signale une référence non définie à test::N. Le problème se pose car la déclaration dans la classe n'est pas une vraie définition.

En C , les membres intégraux const statiques doivent être définis en dehors de la classe dans une portée d'espace de noms. En effet, ils ne peuvent pas être initialisés dans la déclaration de classe selon la norme C (9.4.2/4) :

Si une donnée membre statique est de type const intégral ou const énumération, sa déclaration dans la définition de classe peut spécifier un initialiseur constant [...] Dans ce cas, le membre peut apparaître dans des expressions constantes intégrales. Le membre doit toujours être défini dans une portée d'espace de noms s'il est utilisé dans le programme et la définition de la portée de l'espace de noms ne doit pas contenir d'initialiseur.

Pour résoudre l'erreur de l'éditeur de liens, on peut définir le membre const statique en dehors de la classe , généralement dans le fichier source correspondant :

const int test::N = 10;
Copier après la connexion

Alternativement, pour C 11 et versions ultérieures, le mot-clé constexpr peut être utilisé pour créer une véritable définition au sein de la classe déclaration :

class test {
public:
    static constexpr int N = 10;
};
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal