web-dev-qa-db-fra.com

Un point-virgule (';') n'est-il pas nécessaire après une déclaration de fonction en C ++?

J'ai récemment passé un test de programmation intermédiaire, et l'une des questions que je me suis trompé était la suivante:

Un point-virgule (';') n'est pas nécessaire après une déclaration de fonction.

Vrai ou faux.

J'ai choisi "faux" (et corrigez-moi si je me trompe car j'ai l'impression de devenir fou), une fonction déclaration est ce que vous écrivez avant la définition (en haut du code ) afin que le compilateur connaisse l'appel de fonction avant même de l'appeler, et une fonction définition est ce qui compose la fonction dans son ensemble.

C'est à dire.,

Déclaration:

int func();

Définition:

int func() {
  return 1;
}

La réponse ne devrait-elle pas être fausse?

174
Logan

Vous pouvez avoir une situation où vous déclarez et définissez la fonction en une seule étape, c'est-à-dire si vous incluez la définition de la fonction au point où vous la déclarez. Donc techniquement je suppose que true est correct. Mais la question est formulée de telle manière que j'aurais répondu comme vous l'avez fait.

161
jwismar

En plus de la chose "une définition est aussi une déclaration", ce qui suit est légal C++:

int f(), g();

Cela déclare deux fonctions, f et g, à la fois sans arguments et avec un type de retour de int, mais la définition de f n'est pas suivie (immédiatement ) par un point-virgule. De même, c'est légal:

int f(), i = 42;

Mais il n'est en effet pas permis d'omettre entièrement le point-virgule dans ces cas, il serait donc quelque peu surprenant que l'un ou l'autre soit pris comme exemple de déclaration sans point-virgule suivant. En fait, ce qui suit est illégal:

void *p, f() {}

Autre qu'une (simple) déclaration de fonction, une fonction définition ne peut pas être combinée avec une autre déclaration ou définition à la même spécificateur de type. (Si c'était légal, cela définirait à la fois un void *p Et un void f() {}.)

En tout cas, cela semble être une question de type "gotcha" qui ne devrait pas être dans un test de programmation intermédiaire.

(Oh, au fait, veuillez ne pas écrire de code comme int f(), i = 42;.)

147
Arne Vogel

Les autres réponses et commentaires évoquent plusieurs des nombreuses façons dont il s'agit d'une question horrible, trompeuse et mal écrite. Mais il y a un autre problème que personne d'autre n'a encore identifié. La question est:

Un point-virgule (';') n'est pas nécessaire après une déclaration de fonction. Vrai ou faux.

OK, regardons une déclaration de fonction:

int func();       /* */
/*           ^       */
/*           |       */
/* That whitespace is "after the function declaration". */

Tout cela est la déclaration. La déclaration n'est pas int func() puis suivie de a ;. La déclaration est int func();, puis est suivie d'un espace.

Donc, la question est: un point-virgule est-il nécessaire après la déclaration? Bien sûr que non. La déclaration contient déjà un point-virgule qui l'a terminée. Un point-virgule après la déclaration serait inutile. En revanche, int func(); ; serait un point-virgule après une déclaration de fonction .

La question était presque certainement destinée à poser la question "vrai ou faux: le dernier jeton dans une déclaration de fonction est toujours un point-virgule" Mais ce n'est pas la question qu'ils ont écrit, parce que l'auteur du quiz ne pensait pas clairement au problème.

Mon conseil est d'éviter complètement les quiz de langage de programmation. Ils sont assez horribles.


Fait amusant, alors que nous sommes sur le sujet. En C #, tout cela est légal:

class C {}
class D {};
struct E {}
struct F {};

En C #, une déclaration de classe ou de struct peut se terminer par un point-virgule, ou non, à votre discrétion. Cette étrange petite fonctionnalité a été ajoutée au profit des programmeurs C/C++ qui arrivent en C # et qui ont entre les doigts que les déclarations de type se terminent par un point-virgule inutile; l'équipe de conception ne voulait pas les punir d'avoir cette habitude. :-)

83
Eric Lippert

Vous pouvez également déclarer une fonction comme celle-ci:

int func(){
    return 1;
}

La déclaration est très ambiguë. La bonne réponse devrait être: cela dépend de la façon dont vous déclarez la fonction.

Quoi qu'il en soit, j'aurais choisi faux aussi, et vous pouvez peut-être signaler la question à quelqu'un.

25
Luca Corsini

Un point-virgule (';') n'est pas nécessaire après une déclaration de fonction.

Vrai ou faux.

Vrai. Un point-virgule n'est pas nécessaire après une déclaration. Ni après aucune définition. Ni après aucune déclaration.

De nombreux types de déclarations doivent se terminer par un point-virgule, comme le précise la syntaxe de la section 7 [dcl.dcl]. Mais il n'est jamais nécessaire d'en écrire un deuxième après cela.

20
Marc van Leeuwen

Cela dépend si nous déclarons ou définissons la fonction. Si nous déclarons la fonction, nous devons inclure le point-virgule (;), et si nous définissons la fonction, le point-virgule n'est pas nécessaire.

Une déclaration est comme ceci:

int add(int, int);

Et une définition est comme ceci:

int add(int a, int b)
{
    // ...
}
6
Rocx En Ruff

C'est dommage que la question que vous avez posée ne dise pas "directement après". On pourrait par exemple écrire ceci:

int func()  /* My function */ ;

Ou je pourrais écrire:

int func()
int a = 42;

Dans le premier cas, le point-virgule n'est pas directement après la déclaration, mais ce serait OK.

Dans le second cas, il y a un point-virgule "après" la déclaration, mais pas directement après.

Je pense que Eric Lippert a la bonne idée dans sa réponse .

C'est comme dire "devrait-il y avoir un point après la fin d'une phrase en anglais?". On peut dire qu'une phrase a déjà un point à la fin (sinon ce ne serait pas une phrase) et donc il ne devrait pas y avoir de point après la phrase ..

6
Nick Gammon

Même si je suis d'accord avec presque toutes les autres réponses, déclarant que la question est formulée de manière très ambiguë et que votre réponse est techniquement correcte, permettez-moi de donner une perspective différente:

Voici comment je les ai toujours appelés:

void func();  // The function prototype

...

void func()
{
    // The function definition
}

Je suppose que la question a été formulée avec cette terminologie à l'esprit.

Définition et déclaration sont toutes deux le même concept à mes yeux. "Je définis x = y" == "Je déclare x = y".

Mais bien sûr, il y a une grande différence entre le prototype de fonction (en haut) et la définition réelle de la fonction.

6
Opifex

Vous pouvez utiliser ; pour les prototypes uniquement.

4
M7off

C'est une sorte de question délicate, mais ils ont utilisé le mot declaration qui signifie quelque chose comme ceci:

int example();

C'est donc vrai dans ce cas.

S'ils avaient utilisé le mot implémentation alors cela aurait été faux.

4
dark_3nergy

Le point-virgule (;) est utilisé pour indiquer au compilateur qu'après ce point-virgule (;) une nouvelle instruction démarre.

Je pense donc que le point-virgule (;) est requis uniquement lors d'une déclaration de fonction. Donc, selon moi, la réponse sera vraie.

2
Jatinder

Lorsque les fonctions sont définies avant main ():

  • Pas besoin de point-virgule car la fonction est déjà définie

Lorsque les fonctions sont définies après main ():

  • besoin d'un point-virgule parce que vous prototypez cette fonction et dites au compilateur que la fonction se ferme.
2
shiv shah