8
votes

C code impliquant {}

J'ai vu cela dans certains C code C: xxx

Qu'est-ce que la diable signifie cela signifie?


0 commentaires

3 Réponses :


15
votes

Ce code est l'initialisation d'un struct à l'aide de la syntaxe d'initialisateur Funky C pour initialiser chaque champ par ordre de déclaration, voir http://www.informit.com/guides/content.aspx?g=cplusplus&seqnum=421 . Un effet secondaire important dans le cas de cet exemple est que les champs restants, on ne spécifie pas les valeurs pour être initialisées à Zeros.

Cette astuce est une APIS relativement courante dans Win32 - l'API nécessite que la taille soit prédéfinie comme moyen d'indiquer la version du code cliente à compilation - dans bon nombre de ces cas, on devrait également effacer le tampon, qui impliquerait normalement un appel séparé à par exemple MEMSET avant d'initialiser le champ de taille avec la taille de .

Voir aussi Initialisation de la structure du langage de programmation C / C ++? Pour des exemples connexes


0 commentaires

9
votes

C'est un Expression initiale qui définit le premier champ de w à Tailleof (wininfo) et les autres champs à zéro.


1 commentaires

+1 (et a volé la plus grande partie de la réponse à faire beaucoup moins incomplète: p)



5
votes

Premièrement, ce n'est pas une déclaration, c'est une déclaration. Les déclarations ne sont pas des déclarations dans C

Deuxièmement, le = {/ * Peut * /} partie est un initialiseur - elle spécifie la valeur initiale d'un objet. Normalement, vous utilisez des initialisateurs joints dans {} pour initialiser les objets agrégés: tableaux ou structs. Cependant, une caractéristique peu connue du langage C est que les initialisateurs d'objets scalaires peuvent également être éventuellement joints dans {} , comme dans xxx

quoi Exactement votre moyen de déclaration spécifique dépend de ce que wininfo est. Si w est un agrégat, son premier membre est initialisé par Tailleof (WinInfo) la valeur et le reste est initialisé avec des zéros. Si w est un scalaire, il reçoit simplement la valeur initiale de Tailleof (wininfo) .


3 commentaires

Comme il comprend une initialiseur, ce n'est pas juste une déclaration, mais une définition.


La définition est toujours une déclaration. Donc, il contexte lorsque la distinction n'a aucune importance, le terme la déclaration est normalement utilisé. L'élément syntaxique est toujours appelé Déclaration . Les définitions n'existent que au niveau de la sémantique.


+1: Nice et complète (@nos: C'est ce que j'étais en train de pêcher quand on menait redondant)