42 votes

Virgule omise dans la déclaration de fonction variadic en C ++

Je suis habitué à la déclaration de la variadic fonctions comme ceci:

int f(int n, ...);

Lors de la lecture Du Langage de Programmation C++ , j'ai trouvé que les déclarations dans le livre omettre la virgule:

int f(int n...); // the comma has been omitted

Il semble que cette syntaxe C++ précise que je reçois ce message d'erreur lorsque j'essaie de le compiler à l'aide d'un compilateur C:

test.c:1:12: error: expected ‘;', ‘,' or ‘)' before ‘...' token int f(int n...);

Quelle est la différence entre l'écriture d' int f(int n, ...) et int f(int n...)?

Pourquoi cette syntaxe ajouté C++?

36voto

kfsone Points 7375

Selon le § 8.3.5.4 de la norme C ++ ( projet actuel ):

Où syntaxiquement correct et où "..." ne fait pas partie d'un déclarant abstrait, ", ..." est synonyme de "...".

En bref, en C ++, ... (points de suspension) est un opérateur à part entière et peut donc être utilisé sans la virgule, mais cette dernière est conservée pour des raisons de compatibilité ascendante.

29voto

Barry Points 45207

Actuellement, ces deux déclarations ont le même sens:

int f(int n, ...);
int f(int n ...);

Cela conduit à un problème où les déclarations suivantes sont à la fois juridique, encore très différentes significations:

template <class... T> void f(T...); // function template with parameter pack
template <class T> void f(T...);    // variadic function

Une fois que C++11 introduit variadic templates, il est beaucoup plus probable que la seconde déclaration est une erreur du développeur plutôt que paresseusement l'omission de la virgule. En conséquence, il est proposé de supprimer le dernier de la langue (P0281), mais apparemment, il était rejeté.

15voto

old_mountain Points 3716

Avec int f(int n, ...); et int f(int n...);, comme vous pouvez le voir, les deux , ... et ... a la même signification. Virgule est facultative.

Mais cette int printz(...); est valable en C++ tout int printz(,...); n'est pas (au moins un paramètre nommé doit apparaître avant le bouton de sélection de paramètre). C'est pourquoi vous ne pouvez avoir qu' (...), même si les arguments passés à la fonction ne sont pas accessibles.

6voto

jdlugosz Points 96

Je me souviens du temps, C++, en effet, défini variadic fonction signatues comme vous le notez. Plus tard, l'évolution rapide du langage C (sur le voyage de K&R pour la norme ANSI) a présenté des prototypes ou d' un style nouveau les déclarations de fonction qui a également déclaré des paramètres à l'intérieur des parenthèses après le nom de la fonction. Mais, avec deux différences notables: la virgule avant les points de suspension, et la nécessité pour l'abomination de la (void) pour indiquer un paramètre vide de la liste (pour préserver la compatibilité ascendante du vide parens comme un vieux style de déclaration).

Regarder dans mes archives, je trouve Le Langage de Programmation C++ édition originale "réimprimé avec des corrections juillet 1987" montre:

    l'argument de la déclaration de la liste:
arg-déclaration-listeopt
...opt

arg-déclaration-liste:
arg-déclaration-liste
, de l'argument de la déclaration de
l'argument de la déclaration de

Il n'y a pas de formulaire pour accepter l'option par des virgules. Notez que l'arg-déclaration de la liste d'un comma-separated et cela ne raccrochez pas à fournir une virgule après la liste et avant la prochaine (autre) chose.

C'est le moyen le plus naturel d'écrire cela. Si vous voulez une virgule, vous devez explicitement , ... dans la première production, comme deux distincts (éventuellement des espaces séparés) jetons.

Comme C est des efforts de bonne normalisation a progressé, les compilateurs C++ ont commencé à accepter le C des versions pour permettre une utilisation facile de la norme C fichiers d'en-tête.

Pourquoi le C concepteurs d'ajouter la virgule lorsque cela implique une moins sensible grammaticales rôle des ellipses comme un faux paramètre de l'espace réservé? Je n'ai jamais trouvé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X