2009-07-13 3 views
2

Je reçois l'erreur suivante lorsque vous essayez d'ajouter une variable statique à mon struct:Est-il possible d'ajouter une variable statique à une structure C++?

Undefined :: aa de Symbole dans le module file_name.cpp

s2 est le nom de la structure et aa est la variable statique. Le compilateur que j'utilise est Turbo C++ 3.0.

Comment réparer cette erreur?

+0

S'il vous plaît modifier votre message: le titre dit "non autorisé dans la structure" mais le corps dit "Est-il possible de déclarer des variables statiques dans une classe" –

+0

variables statiques sont autorisés dans une structure - et je pense que vous devez modifier votre question –

+0

est-ce une question. Les statistiques sont autorisées dans une structure. – Goz

Répondre

6

La variable statique n'est pas autorisée dans les structures dans C car C nécessite que tous les éléments de la structure soient placés ensemble. Pour obtenir une valeur d'élément d'une structure, vous comptez par le décalage de l'élément à partir de l'adresse de début de la structure. Cependant, autant que je sache, vous pouvez avoir un membre statique dans une structure C++. Vous obtenez une erreur spécifique (quel compilateur?)

+0

Oui J'ai une erreur de lieur "Symbole non défini s2 :: aa dans le module nom_fichier.cpp" (ici 's2' est le nom de la structure et 'aa' est la variable statique) Turbo C++ 3.0 –

+2

Turbo C++ ?? Man, obtenez un vrai compilateur. –

+1

L'erreur, comme indiqué, n'est pas une erreur de compilation; c'est une erreur de liaison, et cela arrive parce que s2 :: aa n'est défini nulle part. Voir la réponse de Nick Meyer pour un exemple de la façon dont une telle variable est définie. –

5

Pourquoi dites-vous cela? Sous g ++ 4.1.2, cette compile:

#include <iostream> 

struct Test 
{ 
    static int test; // declare (usually in header file) 
}; 

int Test::test = 8; // define (usually in source file) 

int 
main() 
{ 
    std::cout << Test::test << std::endl; 
    return 0; 
} 
3

Les variables statiques sont autorisés dans struct C++ de (comme vous le dites, ils ne sont que des classes avec un spécificateur d'accès par défaut différent).

Les variables statiques ne sont pas autorisées dans les structures C, cependant.

2

Cela fonctionne ...

typedef struct _X 
{ 
    static int x; // declare (usually in header file) 
} X; 

int X::x = 1; // define (usually in source file) 

void _tmain(int argc, _TCHAR* argv[]) 
{ 
    printf("%d", X::x); 
} 
12

Je pense que vous avez probablement oublié de définir le stockage de la variable statique:

int C::v = 0; 
+0

Bien sûr, le message d'erreur affiché par l'OP dit tout. :-) –

+0

Bien que, dans ce cas, le "= 0" est facultatif; IIRC (sur certaines plates-formes), les données statiques qui sont aux valeurs par défaut peuvent être allouées dans .bss, alors que les données initialisées seraient dans .data. –

+0

Les données statiques sont initialisées sur toutes les plates-formes. Peut être méchant si vous changez d'avis et utilisez le tas à la place. Soudain, vous découvrez que vous avez oublié d'initier un membre de la classe. –

0

Dans la structure C++, vous pouvez utiliser des variables statiques même que classe.

Mais vous ne pouvez pas utiliser de variables statiques dans les structures C. Parce que dans c, nous ne pouvons pas accéder à la variable statique avec le nom de la structure. En C++, nous pouvons accéder à la variable membre statique avec le nom de la classe, comme ci-dessous.

ClassName :: staticVariableName

'C' stucture ne fournissent pas une telle installation, mais C++ stucture fait.

Questions connexes