CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C89] (void) ou () ?

BuretteGraduee
BuretteGraduee
Niveau 10
02 avril 2014 à 23:10:56

Salut,

Je voudrais savoir pourquoi je vois souvent pour une fonction void comme argument alors qu'on pourrait très bien utiliser () à la place ? :question:
C'est juste pour la lisibilité ou il y a quelque chose derrière ? :question:

Exemple

void maFonction()
et
void maFonction(void)

Merci :)

MrTrolloIo
MrTrolloIo
Niveau 8
02 avril 2014 à 23:37:51

En fait en C89 quand tu ne mets rien dans les parenthèses ça veut dire que ta fonction accepte un nombre indéfini d'arguments (en C++ l'équivalent serait "void f(...);"), le void entre les parenthèses est donc là pour spécifier que la fonction ne prend aucun argument.

DirectX11
DirectX11
Niveau 6
03 avril 2014 à 20:42:38

Tu es sur de ça ?
Pour moi il faut utiliser la notation "..."
Et utiliser les varargs pour avoir un nombre indéfini de paramètres

MrTrolloIo
MrTrolloIo
Niveau 8
03 avril 2014 à 21:35:14

" Tu es sur de ça ? "

Ouais, le programme suivant sur compilateur C se compile et s’exécute sans erreur:

http://codepad.org/TvoVzht9

A noter que j'ai passé deux arguments à la fonction f dans le main alors qu'il n'y a rien dans la liste de paramètres de la définition de la fonction, ça compile quand même. En revanche si je mets void dans la liste de paramètres de la définition de la fonction, ce code ne compile plus :

http://codepad.org/3HG4HPiw

L'erreur est "Line 7: error: too many arguments to function 'f'".

Sinon oui, si tu veux utiliser varargs il faut utiliser le "..." mais c'est parce que pour utiliser varargs il faut que la fonction ait au moins un argument nommé qu'il faut fournir à la fonction va_start, le problème c'est que si tu écris un truc comme :

"void f(int count);"

Alors ta fonction n'accepte qu'un seul argument, c'est pourquoi il faut rajouter le "..." après le premier argument pour spécifier que la fonction peut prendre des arguments supplémentaires.

DirectX11
DirectX11
Niveau 6
03 avril 2014 à 22:09:04

Effectivement tu as raison, j'ai testé ton premier code et ca fonctionne comme d'habitude le 5 va bien dans le registre rdi (je suis sur une archi x64)
Bon a savoir.

BuretteGraduee
BuretteGraduee
Niveau 10
03 avril 2014 à 22:16:45

Mais dans le cas, où on a pas d'arguments par exemple:

void f()
{
}

int main()
{
f();
return 0;
}

on peut ecrire void f(void) aussi non ?

DirectX11
DirectX11
Niveau 6
03 avril 2014 à 22:20:20

Oui.

sinon MrTrolloIo comment tu recupère tes arguments quand tu as une fonction f() ?

moi pour le test j'ai fait

  1. include<stdio.h>

void f()
{
register int test asm("rdi");
printf("%d\n", test);
}
int main()
{
f(5,9);
return (0);
}

MrTrolloIo
MrTrolloIo
Niveau 8
03 avril 2014 à 22:37:38

" Mais dans le cas, où on a pas d'arguments par exemple:
...
on peut ecrire void f(void) aussi non ? "

Oui, c'est justement dans ce cas où tu es supposé écrire void dans la liste de paramètres, comme je l'ai dit plus haut ça sert à spécifier que la fonction ne prend aucun argument. A vrai dire une fonction du style "void f();" c'est plutôt une faute de style en C89, cette notation est un truc propre aux anciennes versions de C (celles qui datent d'avant la norme C89) et elle a été conservée pour que les anciens programmes C puissent être compilés sur des compilateurs C modernes.

A noter qu'en C++ c'est le contraire (oui c'est le bordel), si une fonction ne prend aucun argument il faut écrire "void f();", la notation "void f(void);" existe aussi mais c'est une faute de style en C++.

" sinon MrTrolloIo comment tu recupère tes arguments quand tu as une fonction f() ? "

A part accéder directement aux emplacements des arguments (que ce soit les registres ou la pile) via des commandes assembleur ou des pointeurs je ne vois pas vraiment d'autres moyens, de toute façon comme je l'ai dit plus haut la notation "void f();" en C89 c'est un truc obsolète.

BuretteGraduee
BuretteGraduee
Niveau 10
03 avril 2014 à 23:02:00

Ok merci :)

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment