retour rien de non-annuler la fonction en C
ce qui est considéré comme la meilleure pratique dans le fragment de code suivant:
int foo(struct data *bar, struct info bla) {
if (!bar) {
bla->status = 0;
return;
}
...
}
en fait, il fonctionne très bien. mais je me sens mal à l'aise avec gcc
me donner un avertissement.
voici le code:
static int pop(struct stack **stack, struct info *info) {
int ret;
struct stack *tmp;
if (!*stack) {
info->error = 0;
return;
}
ret = (*stack)->data;
tmp = *stack;
*stack = (*stack)->next;
free(tmp);
return ret;
}
c'est juste ce certains cas, que je n'ai pas besoin de valeur de retour. dans
Retourner le code d'erreur; dans ce cas, vous pouvez
le point est, que je n'ai pas envie/besoin de quelque chose de significatif pour être retourné. je veux juste faire en sorte de sortir de l'appel de la fonction.
Et qu'attendez-vous de l'appelant? Il s'attend à un retour de la valeur. Si la valeur de retour n'est pas significative, car elle peut déterminer sa validité par un autre mécanisme, puis il suffit de choisir arbitrairement la valeur de retour.
Vous devez soumettre des réponses à la place des commentaires si vous voulez répondre à la question.
...
il y a, en fait, un couple d'entiers retourné. c'est pourquoi je ne peux pas utiliser void ()
.Retourner le code d'erreur; dans ce cas, vous pouvez
return 0;
pour SUCCESS
en entrée n'est pas nulle. De retour -1 ou quelque chose pour NULL_POINTER
de l'autre.le point est, que je n'ai pas envie/besoin de quelque chose de significatif pour être retourné. je veux juste faire en sorte de sortir de l'appel de la fonction.
Et qu'attendez-vous de l'appelant? Il s'attend à un retour de la valeur. Si la valeur de retour n'est pas significative, car elle peut déterminer sa validité par un autre mécanisme, puis il suffit de choisir arbitrairement la valeur de retour.
Vous devez soumettre des réponses à la place des commentaires si vous voulez répondre à la question.
OriginalL'auteur guest | 2010-07-12
Vous devez vous connecter pour publier un commentaire.
La meilleure pratique est de ne pas écrire du code comme ça. Si vous ne pouvez pas retourner un entier, de la sorte, à ce stade, vous avez besoin de remodeler votre code. Notez que la fonction comme l'écrit sera renvoyer une valeur de quelque sorte pour le code appelant - vous ne savez pas ce que cette valeur sera.
Le classique chemin de ronde, c'est pour retourner à la valeur par l'intermédiaire d'un pointeur de paramètre avec la fonction retour d'un statut:
Edit: Dans le code que vous avez posté, vous êtes la manipulation d'une pile. Popping une pile vide est un comportement indéterminé pour toutes les piles je sais, de sorte que vous pouvez simplement retourner un entier qui prend votre fantaisie (je reviendrais 0) et le document sur le comportement.
info->status
, qui témoignent de la réussite/échec.alors pourquoi avez-vous préciser le type de retour comme
int
en premier lieu?Peut-être que si vous avez affiché le code réel, nous pourrions vous conseiller mieux.
Si vous êtes uniquement intéressé par la réussite/échec, puis redeclare la fonction de retour booléen: vrai ou faux.
je vois ce que tu veux dire. semble, comme je l'ai était trop obsédé par ne passant pas par le retour comme un argument.
OriginalL'auteur
Le comportement est indéfini, et que l'avertissement est là pour une bonne raison! Renvoyer une valeur, ou de modifier la fonction à une fonction void.
OriginalL'auteur harald
Sous l'hypothèse que la valeur de retour n'est pas utilisé pour ce cas précis, il suffit de retourner la valeur 0. Si la valeur de retour est utilisé, alors il y a un grave défaut dans la logique du programme qui doit être résolu en premier.
OriginalL'auteur Secure
Type
return 0;
oureturn -1;
si c'est une erreur et non d'erreur entiers est positif signé.OriginalL'auteur Svisstack
Si vous ne pouvez pas retourner quelque chose, vous pourriez penser à lancer une exception, ou, comme déjà indiqué, la refonte de votre code.
Désolé, mon mauvais, raté le C ici, oubliez l'exception alors!
Vous pouvez lancer des exceptions en C, il suffit d'écrire une fonction C++ qui lève l'exception et la mettre dans une bibliothèque. C n'a pas de soins de la langue dans laquelle la fonction est écrite et les exceptions C++ sont conçus pour co-exister avec du code C. La capture de l'exception avec une semblable fonction de la bibliothèque peut être un peu plus délicat 🙂 Et voici un exemple de mise en œuvre de Try/Catch qui utilise setjmp/longjmp: nicemice.net/cexcept
OriginalL'auteur Tapdingo
renvoie 10. Le shell bash sur Mac OS X, le confirme. C'est, chaque
int
de retour de la fonction retourne quelque chose en retour, devrait en être de même pour les fonctions qui renvoient à d'autres types, comme le bien. Si vous ne rentrez pas explicitement, quelque chose que vous ne savez pas de qui est retourné. Si vous n'êtes pas en mesure de retourner quelque chose à la fin de la fonction, essayer de retourner vide pour voir si il se casse le code. En cas de casse, les fonctions nécessite plus de travail, sinon, passez à l'aide de vide type de retour.en C++, elle renvoie 0.
autant que je sache aussi C (C99?) permet à l'absence de l'instruction return dans le main, et "en silence" ", ajoute" un
return 0;
(ou de quelque valeur que ce soit dit succès)printf renvoie 10, mais le retour de la fonction main() n'est pas défini. Pourrait être de 10 ou n'importe quel autre numéro. Vous avez juste balançant registre crud passé ici.
OriginalL'auteur vpit3833
Je voudrais envisager d'ajouter un troisième paramètre qui serait en fait la "valeur de retour" et au lieu de retourner le résultat de la fonction, il suffit de retourner son statut, ce qui pourrait être un
enum
par exemple ( et vous pourriez avoir de la "STATUS_OK", "STATUS_FAIL", "STATUS_NO_RESULT", etc...).Ce sera compréhensible pour toute personne utilisant votre fonction et en même temps le comportement souhaité (c'est à dire, de ne pas retourner une valeur signifierait de ne pas toucher à la troisième paramètre et retour "STATUS_NO_RESULT" ).
OriginalL'auteur PeterK
Puisque vous utilisez
info->error
- à-dire si la fonction a échoué ou pas, vous pouvez retourner tout ce que vous voulez, puisque l'appelant doit ignorer la valeur de retour. De sorte que vous pouvez le silence de l'avertissement avecreturn -1
,return 0
,return MAGIC_NUMBER
... ...En général, pourtant, la fonction sont codés dans le "sens inverse": la valeur de retour indique si la fonction a réussi ou pas. Si tous les int les valeurs de retour sont bonnes, vous pouvez écrire la fonction de sorte qu'elle retourne l'échec ou le succès, et le succès que vous remplissez les données. Dans votre cas, votre info struct pourrait tenir un
int data
, ou vous pouvez ajouter un autre argument pour la touche func.De cette façon, l'appelant peut faire quelque chose comme
L'utilisation dans votre cas est moins intuitif:
BTW, vous ne définissez pas
info->error
à quelque chose de différent de 0, de sorte que votre code est potentiellement buggé; par exemple,déclencherait toujours une erreur, même si en effet la pile est ok et donc les données sont valides.
OriginalL'auteur ShinTakezou