2010-06-22 11 views
2

Ces deux méthodes sont-elles équivalentes?Comment initialiser un tableau char à la déclaration

char a[10] = ""; 
char a[10] = { 0 }; 

Aussi, je voudrais déclarer initialiser une struct, mais cela ne fonctionnera pas dans gcc:

struct c 
{ 
    char d[10]; 
    int e; 
}; 
struct c f = { 0 }; 

ac: La fonction 'principale':
ac: 33: avertissement: manquant accolades autour initialiseur
ac: 33: avertissement: (près de l'initialisation pour 'f.d')
ac: 33: avertissement: manquant initialiseur
ac: 33: avertissement: (près de l'initialisation pour 'f.e')
a.c: 33: avertissement: variable inutilisée 'f'

Répondre

5
  1. Oui, ils sont équivalents.

  2. Sous les options par défaut, l'initialisation de la structure se compile sans avertissement. Si vous le compilateur est difficile, alors vous devez fournir une chaîne (ou l'autre des deux formes dans votre première question) et un entier:

    struct c 
    { 
        char d[10]; 
        int e; 
    }; 
    struct c f = { "", 0 }; 
    struct c g = { { 0 }, 0 }; 
    

Que signifie « pointilleux »:

Osiris-2 JL: cat x.c 
struct c 
{ 
    char d[10]; 
    int e; 
}; 
struct c f = { 0 }; 
Osiris-2 JL: gcc -c x.c 
Osiris-2 JL: gcc -Wall -c x.c 
x.c:6: warning: missing braces around initializer 
x.c:6: warning: (near initialization for ‘f.d’) 
Osiris-2 JL: gcc -O -Wall -c x.c 
x.c:6: warning: missing braces around initializer 
x.c:6: warning: (near initialization for ‘f.d’) 
Osiris-2 JL: gcc -O -Wextra -Wall -c x.c 
x.c:6: warning: missing braces around initializer 
x.c:6: warning: (near initialization for ‘f.d’) 
x.c:6: warning: missing initializer 
x.c:6: warning: (near initialization for ‘f.e’) 
Osiris-2 JL: 

Dans ce contexte, GCC « conformément aux définitions pointilleux » signifie ajouter des options comme « -Wall » et « -Wextra » pour obtenir plus d'avertissements que sont requis par la norme C que GCC compile à. Comme je n'ai pas spécifié quelle norme, elle fonctionne selon la norme GNU-99 (-std=gnu99).

Pour obtenir le message 'variable inutilisée' de la question, je devrais rendre la variable f dans une variable statique.

+0

Qu'est-ce que tu veux dire avec la chiquenaude? – Job

+1

Avec gcc -Wall pour activer tous les avertissements, dans MSVC c'est le niveau d'avertissement 4 dans l'une des options –

1

1) Oui, ils sont équivalents. 2) Essayez

struct c f = { "", 0 } 

Vous devez initialiser à la fois la valeur. Je me souviens avoir des problèmes aussi, vous pouvez essayer

struct c f = (struct c){ "", 0 } 

si cela ne fonctionne pas.

Voir aussi this page.

+0

Il n'est pas nécessaire d'initialiser les deux valeurs. – AnT

6

Oui, les deux initialisations char [] sont identiques - les deux vont initialiser le tableau pour contenir des zéros.

Pour le problème de la structure, essayez:

struct c f = { {0}, 0 }; 

(avec les nouvelles versions de gcc qui prennent en charge C99, vous pouvez également name the elements of the structure being initialised.)

1

Oui, les deux premières initialisations sont équivalentes.

La deuxième initialisation fonctionnera dans GCC. Votre code est parfaitement correct.En langage C, le { 0 } est un Universal Zero Initializer utilisable avec pratiquement n'importe quel type. C'est un idiome ancien et très bien établi. Ce que vous obtenez de GCC est juste les avertissements, mis là par quelqu'un qui a fait une décision plutôt ignorée d'interférer avec les fonctionnalités de l'Universal Zero Initializer. [Rant] Je comprends leur intention générale, mais le formulaire spécifique { 0 } aurait dû être traité comme une exception sans avertissement.

Questions connexes