Maison >développement back-end >C++ >Pourquoi est-ce que j'obtiens une erreur « Référence non définie » lors de l'utilisation d'un tableau de caractères constexpr statique dans une classe C ?

Pourquoi est-ce que j'obtiens une erreur « Référence non définie » lors de l'utilisation d'un tableau de caractères constexpr statique dans une classe C ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-19 14:13:10801parcourir

Why Do I Get an

Référence non définie à Static constexpr char[]

En C, lors de la déclaration d'un tableau de caractères const statique dans une classe et de son utilisation dans un fonction membre, on peut rencontrer une erreur indiquant une référence non définie. Cette erreur survient en raison de la séparation entre la déclaration et la définition dans les membres statiques.

Problème

Considérez l'exemple suivant :

// header file (foo.hpp)
struct Foo {
  void bar();
  static constexpr char baz[] = "qux";
};

// cpp file (foo.cpp)
void Foo::bar() {
  std::string str(baz); // undefined reference to baz
}

Dans ce Par exemple, le tableau de caractères statique const baz est déclaré dans la classe mais n'est pas défini. La compilation du code avec GCC entraînera l'erreur "référence non définie à baz."

Solution

Pour résoudre ce problème, vous devez fournir une définition pour le code statique membre dans le fichier cpp. Cette définition spécifie le contenu réel du tableau. Dans l'exemple ci-dessus, ajoutez la ligne suivante au fichier cpp :

constexpr char Foo::baz[];

Explication

En C , les membres statiques nécessitent à la fois une déclaration et une définition, ce qui sont des entités distinctes. La déclaration spécifie le type et le nom du membre, tandis que la définition fournit son implémentation ou sa valeur réelle.

Pour les membres statiques déclarés dans une classe, la déclaration apparaît généralement dans la définition de la classe, avec tout initialiseur. Cependant, la définition doit être fournie en dehors de la définition de la classe, généralement dans un fichier cpp séparé ou à la fin de la définition de la classe.

En fournissant une définition pour le membre statique baz, l'éditeur de liens pourra résoudre sa référence et générer le code nécessaire. Sans la définition, l'éditeur de liens ne peut pas déterminer le contenu réel du tableau et entraînera une erreur de référence non définie.

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!

Déclaration:
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