C des arguments par défaut
Est-il un moyen de spécifier des valeurs par défaut des arguments à une fonction en C?
- veulent juste un peu plus de C, pas du C++. pense que C+ . avec une variété de petites améliorations levé à partir de C++, mais pas la grande pagaille. Et, s'il vous plaît, pas de lien différents-loader. devrait être juste un autre préprocesseur comme étape. normalisé. partout...
- Connexes question que je ne voyais pas répertoriés dans la barre latérale.
- Je dirais d'arrêter d'être un barbare et d'apprendre à utiliser le C++(11, ...) du bien - jk! /me met hors de flammes... mais... vous viendra à l'aimer... hahaha je ne peux pas m'en empêcher, désolé.
- Double Possible de les valeurs par Défaut sur les arguments dans les fonctions C et de surcharge de fonctions en C
Vous devez vous connecter pour publier un commentaire.
Pas vraiment. Le seul moyen serait de écrire une fonction varargs et de remplir manuellement les valeurs par défaut pour les arguments de l'appelant ne passe pas.
f(5, 6, 7, NULL)
avec une sorte de terminaison de l'argument. Je fais occasionnellement d'écrire des fonctions pour lesquelles cela peut avoir du sens, mais pas souvent, et c'est pourquoi j'ai commencé ma réponse en disant: "Pas vraiment."open(2)
appel système utilise cette valeur pour un argument facultatif qui peut être présent selon les arguments requis, etprintf(3)
lit un format de chaîne de caractères qui spécifie combien d'arguments il y en aura. Les deux utilisent varargs, en toute sécurité et de manière efficace, et bien que vous pouvez certainement vis d'eux,printf()
en particulier semble être très populaire.Wow, tout le monde est un pessimiste autour d'ici. La réponse est oui.
Il n'est pas anodin: à la fin, nous aurons la fonction de base, un soutien struct, une fonction wrapper, et une macro
autour de la fonction wrapper. Dans mon travail, j'ai un ensemble de macros pour automatiser tout cela; une fois
vous de comprendre le flux, il sera facile pour vous de faire de même.
Je l'ai écrit ailleurs, voici donc une détaillé lien externe pour compléter le résumé ici: http://modelingwithdata.org/arch/00000022.htm
Nous aimerions tourner
dans une fonction qui prend les valeurs par défaut (i=8, x=3.14). Définir un compagnon struct:
Renommer votre fonction
f_base
, et de définir une fonction wrapper qui définit les valeurs par défaut et les appelsla base:
Maintenant ajouter une macro à l'aide de C variadic macros. De cette façon les utilisateurs n'ont pas à savoir qu'ils sont
en fait le remplissage d'une
f_args
struct et pensent qu'ils font d'habitude:OK, maintenant, tout de travail:
Vérifier les règles sur la façon composé d'initialiseurs de définir les valeurs par défaut pour les règles exactes.
Une chose qui ne fonctionne pas:
f(0)
, parce que nous ne pouvons pas distinguer entre, d'une valeur manquante etzéro. Dans mon expérience, c'est quelque chose à regarder dehors pour, mais peuvent être pris en charge comme
le besoin s'en fait sentir---la moitié de la durée par défaut est vraiment zéro.
Je suis passé par la difficulté d'écrire ceci parce que je pense que les arguments nommés et les valeurs par défaut
font vraiment de codage en C plus facile et encore plus de plaisir. Et
C est génial d'être aussi simple et ayant encore assez pour rendre tout cela possible.
{}
(vide initialiseur) est une erreur de C99.#define vrange(...) CALL(range,(param){.from=1, .to=100, .step=1, __VA_ARGS__})
missing initializer for field
avertissement doit ignorer queOui. 🙂 Mais pas de la façon que vous attendez.
Malheureusement, C ne permet pas la surcharge de méthodes de sorte que vous ne finissent avec deux fonctions différentes. Encore, en appelant f2, vous auriez fait appel f1 avec une valeur par défaut. C'est un "Don't Repeat Yourself" solution, qui vous aide à éviter de copier/coller le code existant.
Nous pouvons créer des fonctions qui utilisent des paramètres nommés (uniquement) pour les valeurs par défaut. C'est une continuation de bk.'s réponse.
Le standard C99 définit que plus tard les noms dans l'initialisation de remplacer les éléments précédents. Nous pouvons aussi avoir une certaine norme de paramètres positionnels ainsi, il suffit de modifier la macro et de la fonction de signature en conséquence. La valeur par défaut des paramètres ne peut être utilisé dans le paramètre nommé style.
Programme de la sortie:
OpenCV utilise quelque chose comme:
Si l'utilisateur ne sait pas ce qu'il doit écrire, cette astuce peut vous être utile:
Pas.
Pas même le tout dernier standard C99 prend en charge cette.
Non, c'est un langage C++ fonctionnalité.
Probablement la meilleure façon de le faire (ce qui peut ou peut ne pas être possible dans votre cas, en fonction de votre situation) est de passer à C++ et de l'utiliser comme "une meilleure C'. Vous pouvez utiliser C++ sans utiliser les classes, les modèles, la surcharge d'opérateur ou d'autres fonctionnalités avancées.
Cela vous donnera une variante de C avec la surcharge de fonctions et des paramètres par défaut (et toutes les autres fonctionnalités que vous avez choisi d'utiliser). Vous avez juste à être un peu disciplinée si vous êtes vraiment sérieux au sujet en utilisant seulement un sous-ensemble restreint de C++.
Beaucoup de gens vont dire que c'est une très mauvaise idée d'utiliser le C++ de cette façon, et ils pourraient avoir un point. Mais c'est juste un avis; je pense que c'est valable pour utiliser les fonctionnalités de C++ que vous êtes à l'aise avec, sans avoir à acheter l'ensemble de la chose. Je pense qu'une partie importante de la raison pour le succès de C++, c'est qu'il a utilisé par beaucoup de programmeurs dans les premiers jours exactement de cette manière.
Réponse courte: Pas.
Légèrement plus longue réponse: Il y a une vieille, vieux solution de contournement lorsque vous passez une chaîne de caractères que vous analyser pour les arguments optionnels:
où l'opt peut inclure "nom=valeur" paire ou quelque chose, et que vous appelleriez comme
Évidemment, c'est seulement de temps en temps utiles. En général, quand tu veux une interface unique pour une famille de fonctionnalité.
Vous trouvez encore cette approche de la physique des particules codes qui sont écrits par des professionnels de l'programmes en c++ (comme par exemple RACINE). Son principal avantage est qu'il peut prolonger presque indéfiniment, tout en maintenant le dos de compatibilité.
struct
et demander à l'appelant de faire un, de remplir les champs pour les différentes options, et de le passer par l'adresse, ou de passerNULL
pour les options par défaut.Encore une autre option utilise
struct
s:Pas.
20202020
dans l'hexagone, mais comment dois-je taper?Oui, avec des caractéristiques de C99 vous pouvez le faire. Cela fonctionne sans définir de nouvelles structures de données ou alors sans la fonction de décider au moment de l'exécution comment il a été appelé, et
sans aucun calcul de frais généraux.
Pour une explication détaillée, voir mon post à
http://gustedt.wordpress.com/2010/06/03/default-arguments-for-c99/
Jens
Non, mais vous pouvez envisager d'utiliser un ensemble de fonctions (ou macros) pour approximer par défaut arguments:
Généralement non, mais dans gcc, Vous pouvez faire le dernier paramètre de (funcA() en option avec une macro.
Dans funcB() j'utilise une valeur spéciale (-1) pour signaler que j'ai besoin de la valeur par défaut pour le " b " en paramètre.
J'ai amélioré Jens Gustedt de réponse de sorte que:
variadic.h:
Simplifié scénario d'utilisation:
Et avec _Generic:
Et avec variadic fonction de la sélection du nom, qui ne peut pas être combiné avec _Generic:
Un autre truc à l'aide de macros:
Si un seul argument est passé,
b
reçoit la valeur par défaut (dans ce cas, 15)Oui, vous pouvez faire quelque chose simulair, ici, vous devez connaître les différentes listes d'arguments vous pouvez obtenir, mais vous avez la même fonction pour gérer ensuite tous.
OUI
Par le biais de macros
3 Paramètres:
Si vous voulez 4ème argument, puis un supplément de my_func3 doit être ajouté. Remarquer les changements dans VAR_FUNC, my_func2 et my_func
4 Paramètres:
Seule exception que float variables ne peut être donné des valeurs par défaut (sauf si c'est le dernier argument que dans les 3 paramètres de cas), parce qu'ils ont besoin de la période de ('.'), ce qui n'est pas acceptée dans les arguments de la macro. Mais peut comprendre un travail autour comme on le voit dans my_func2 macro (de 4 paramètres cas)
Programme
De sortie:
Pourquoi ne pouvons-nous pas faire cela.
Donner l'argument optionnel, par défaut, une valeur. De cette façon, l'appelant de la fonction n'a pas nécessairement besoin de passer la valeur de l'argument. L'argument prend la valeur par défaut.
Et facilement cet argument devient facultatif pour le client.
Pour, par exemple,
void foo(int a, int b = 0);
Ici b est un argument facultatif.