Je veux redéfinir NULL dans mon programme tel que mais cette définition ne fonctionne pas dans l'instruction suivante: p> char *ch = MYNULL;
8 Réponses :
#define MYNULL 0 will work in C++
Cela fonctionnera uniquement pour C ++. C a besoin de NULL pour être #define (vide *) 0.
@Paul: Définition de null code> comme
0 code> fonctionne bien en C, vous perdez juste une légère sécurité de type. Cependant, en utilisant
0 code> correctement pour
null code> in c ne créera aucune erreur. Si vous allez réfuter avec la valeur de Varargs Sentinel, il est recommandé à
char * code> même lorsque vous utilisez
null code>
@Évan - Tu as raison - j'ai vérifié - merci de me corriger!
#define NULL 0 //C++ #define NULL ((void*)0) //C
#ifdef __cplusplus #define MYNULL 0 #else #define MYNULL ((void*)0) #endif will work in both of them.
@Ruben: Je suis d'accord, cependant, si vous écrivez une bibliothèque d'agnostique linguistique (c'est-à-dire que vous souhaitez que le code soit compilé dans les deux langues), vous avez besoin d'une certaine manière. Cela dit avec la mise en garde qu'ils sont différentes langues et une "bibliothèque d'agnostique linguistique" pour C & C ++ est un piratage.
@Binary inquiétant: Si vous construisez un remplacement de la totalité d'une bibliothèque standard pour le nouveau compilateur, vous venez de concevoir soigneusement pour effectuer une part d'ATROGRAM pour une part de marché sur le marché en expansion rapide des compilateurs C / C ++, cette est une excellente idée. Si vous n'êtes pas dans cette position, je ne vois pas comment cela va améliorer ce qui va améliorer ce qui est intégré et i> ne pas avoir de mauvais effets secondaires tels que ne pas bien jouer avec nullptr < / Code> Comme indiqué dans la réponse de @ Johannes ou toute autre future choses qu'il pourrait interagir.
Il y a une onus sur des personnes comme Yossarian qui comprennent cela, de repousser les mauvaises idées, comme en plus de l'objectif évident de ce site, qui est destiné aux FGITWS de résoudre les problèmes de programmation de la planète dans le temps record de la planète.
N'a pas appelé explicitement, mais tout
La question était "Comment définir NULL en utilisant #define en C ++ et c ', comme je l'ai compris, ce n'était pas quoi de faire avec NULL si j'attends que quelqu'un implémente C ++ 0x bien", ou "y a-t-il mises en garde à l'aide de NULL '. Pourquoi ne supposez-vous pas que le CPPDEV sait exactement qu'il fait et veut juste répondre à cette question? C'est ce que je déteste à propos de Stackoverflow - Habituellement, j'ai des raisons d'utiliser mes solutions et de ne pas vouloir des conseils comment le faire d'une autre manière. (Eh bien, la question ne dispose pas de locaux de l'assumer). Utilisez vos orbes magiques et autres accessoires à venir pour quelque chose de plus intéressant.
@Yossarian: Une partie d'une bonne question (méritant de nombreux upvotes) est de faire des fizzbin et / ou d'établir autrement ce que vous avez et que vous n'avez pas essayé de faire sur votre route pour décider de déranger la toile lazyweb avec votre question importante). Et ne vous inquiétez pas d'être la seule personne de la planète qui se réjouit de manière à ce que ce soit et (pas tant (pas tant) - points (dans tous les sens du terme): P mais pendant que nous fractionnez les cheveux, vous pensez vraiment Cela, mesuré contre toutes les autres réponses sur le site, celui-ci est particulièrement digne de 96 représentants? (Et non, ma réponse ne vaut pas 60 - c'est une dup d'un commentaire). Allez Johannnes!
Je vous renvoie aux commentaires sur la question, les bowvotes sur les vôtres, les avotes sur les commentaires sur la question de la vérification indépendante de la vérification de votre choix, vous êtes trop attaché à moi être un mauvais gars. Et plus inquiet: je vous blâme pour garder cette réponse à la recherche de crédible!
Cela ne me dérange pas les points, je n'aime tout simplement pas votre argumentation.
Donnez-moi un -1 avec un commentaire et une personne désireuse de se tenir sur leur opinion et / ou de le justifier avec une explication de la raison pour laquelle ils ressentent le bon par rapport à un -1 n'importe quel jour. Pour des choses subtiles telles que cette question, laissez la règle de la foule trier les choses en fonction de la compréhension potentiellement imparfaite en utilisant des bowvotes pour annuler les upvotes basées sur des compréhensions incomplètes. Ce n'est tout simplement pas bon. Je dois dire que ce non-sens arrive beaucoup plus sur les balises sur cette question par rapport aux autres que je regarde. Comme je le dis, nous détestons tous alors :(
J'ai répondu à la question, l'Askee voulait évidemment cette réponse. Votre réponse est la bande de quoi-si-ifs, spéculation sur C ++ 0X et en supposant qu'il existe une bibliothèque standard correcte pour la plate-forme Askee se développe.
@Ruben Bartelink: Comme je l'ai dit, je suis d'accord. Blame Justifié prise au cœur. De plus, je pourrais être disponible pour cette pinte très méritée quelque part vers la fin mars. J'espère que tout va bien Pal :)
@Binaire inquiet: dans ma rage aveugle, j'ai raté la subtilité dans votre commentaire original et l'interprété comme disant «c'est bon dans certaines circonstances» - voir qu'il n'y avait pas de smileys, des marques d'exclamation ou quoi que ce soit: di croire que c'est certainement utilisé par le autre argument comme une béquille aux fins de la mise à l'échelle d'un cheval élevé. Si vous devez attendre jusqu'à fin mars pour une pinte, il sera effectivement très bien mérité. Suggérez-moi un jour autre que vendredi et je vais le craindre dans le journal ...
Félicitations pour résoudre ce cascifler intrigant pour notre intervenant galant qui peut maintenant continuer sur la route pour écrire une bibliothèque indépendante de la langue qui va être vraiment facile à porter et à maintenir au fil du temps grâce à votre aperçu unique. Sérieusement, le nombre net de votes ou de points, si un intervenant accepte une réponse ne comptait pas vraiment pour beaucoup. J'aimerais savoir quelle plate-forme exotique et délivrance nous traitons réellement ici: D
Je ne suis pas sûr, si vous avez jamais quitté la plate-forme X86 / X64, mais il existe de nombreux systèmes embarqués sans aucune bibliothèque standard (mais avec des compilateurs C / C ++ de travail), votre ignorance n'est pas un argument précieux.
@Ruben Bartelink: Zing! Point pour Yossarian! (désolé, je ne pouvais pas m'en empêcher)
Permet de ne pas entrer dans un concours de plateformes ou d'appeler l'autre côté ignorant. Rappelez-vous que j'ai supposé tout le long (correctement, je crois) que vous savez que c'est une mauvaise chose à faire. Je ne participerais pas aux services de quiconque posant la question de la forme qu'il a été posée en travaillant avec un compilateur hypothétique Bare Bones sans un seul fichier d'en-tête nulle part #defining Null. PS Bien que vous soyez irrité, pouvez-vous descendre à Johannes aussi comme sa réponse n'est évidemment pas aussi fantastique que celle-ci! @Binary inquiet: C'est comme une flamme de la fin de laneinale tardif, complète avec des personnes les plus églises!
Désolé pour le terme ignorance, l'anglais n'est pas ma langue principale, je ne voulais pas être impoli, je viens de l'avoir découvert dans le dictionnaire [signifiait le manque de connaissances]. Le "compilateur sans nu" n'est pas hypothétique, il est largement utilisé, encore une fois, si vous développez uniquement pour les gros systèmes, vous ne pouvez avoir aucune idée d'autres utilisations de C. Je peux même réaliser que quelqu'un a besoin de cela dans ' Le projet de Big System 'De nos jours. (Donc non, je ne pense pas que cela soit en général BTTD). BTW: Je ne suis pas sûr que vous êtes celui qui me dise qui deviendra / descendre;)
Je ne suis aucune autorité sur la façon de voter - il suffit de souligner que mettre au hasard --1s sur des choses sans commentaire n'est pas très cool à moins que vous n'ayez une consistance à ce sujet. Comme je l'ai dit, n'abandonnez pas le concours de plateformes. Et spéculer sur des compilateurs fantastiques généralisés sans en-tête (peut-être qu'ils n'ont même pas de précompiler, HAH: P) que le questionneur utilise est le mieux laissé jusqu'à ce qu'il soit confirmé que nous sommes réellement sur ce territoire. Entre-temps, j'appelle cet avis relativement mauvais (malgré l'être techniquement correct) et 19 personnes appellent que Johannes répond à de bons conseils.
Et pendant que nous descendons à la pédantisme, le questionneur a déclaré Redefine B> Nous avons donc des preuves de ce pas i> être un scénario de licorne. Je suppose que vous utilisez les récents upvotes (et le manque de celles de la réponse de @johannes) comme une justification ultérieure de se sentir si suprêté justifiée: p
On dirait que j'ai manqué une bonne flamewar tandis que des baises à l'école :-( Je suis d'accord avec @Ruben, il n'y a rien de mal à la réponse aux yossarians en soi. (En tant que note latérale, il n'est pas explicitement indiqué que l'OP a besoin de la compatibilité de l'opération en plein essor, alors s'il vous plaît ne pas belabor sur la fourniture d'informations "impessayes"). Cependant, ma réponse montre la même solution et donne un avis général, il est donc ouvert à la communauté de décider qui est la meilleure réponse. La baisse pour négliger les avotes est un commun. Pratiquez ici et il n'y a pas de raison sérieuse de le décourager.
@Ruben et Yossarian: bon point sur les scénarios désossés.
Quel est le problème exactement avec votre NULL d'où vous êtes censé?, à savoir, ou p> Comme mentionné dans la réponse de @johannes Rudolph, tout domaine que vous faites n'est probablement pas probablement une preuve très future face à des choses comme éditer: tandis que STDLIB (et beaucoup d'autres) sont mandatés pour inclure un ps en général, c'est juste une mauvaise idée de s'impliquer dans Ce genre de scandale à moins d'avoir une raison vraiment bonne raison. Vous n'avez pas développé la pensée qui vous a amené à ressentir le besoin de le faire. Si vous pouviez ajouter des détails à ce sujet, il risque de mener à de meilleures réponses. Les autres personnes qui répondent à la question auraient dû signaler cela dans leurs réponses aussi, mais je suppose que fgitw en tant que FGITW fait le mieux: d p> Edit 2: Comme indiqué par @yossarian: la justification unique de faire cela est S'il n'y a pas de null défini dans une forme de langage-agnostique appropriée ailleurs dans votre système. Compilateurs nus sans en-tête et / ou si vous écrivez votre propre bibliothèque standard personnalisée à partir de zéro sont des exemples d'une telle situation. (Dans un scénario aussi nu, j'irais avec la réponse de @ Lilburne (assurez-vous d'utiliser nullptr code> etc. p>
null code>, STDDEF est l'en-tête la plus canonique [et fait des décennies]. P>
0 code> autant que possible)) p> p>
@ Legends2k: Cela me semble évident (et @Neil Butterworth dans les commentaires sur la question mais personne + 1'd qui devant moi), mais je suppose que les gens aiment résoudre des énigmes qui n'ont pas besoin d'être résolus.
@Ruben: programmeurs, vous voyez;)
@ Legends2k: Tu veux dire "pirates"! Je suppose que les gens ne sont pas sur ce site parce qu'ils croient que tout sur la planète qui a besoin de dire a déjà été dit: P
@Ruben: Eh bien 'Hackers', mais pas tous, beaucoup d'entre eux sont cependant :)
@ -1er: Soins pour expliquer votre bowvote? Si vous avez une raison pour laquelle il s'agit d'une réponse à la tête erronée, le monde pourrait bénéficier du partage du raisonnement. (Je peux offrir un tas de spéculation et quoi-si est sur l'identité de l'électeur mystérieux si vous le souhaitez!)
D'accord. Votre solution assume la bibliothèque standard de travail. Pour développer des frites Atmel, il y a un compilateur C, mais aucune bibliothèque standard, pas de stddef.h. Si vous souhaitez utiliser NULL, utilisez peut-être un en-tête propriétaire ou de le définir vous-même.
Ah, largement admis applicable coupé par un seul contre-exemple perspicace, merveilleux. Néanmoins, ajoutera la Proviso à couvrir cette affaire qui, alors que la cueillette de la NIT est possible.
@RUBEN: Y a-t-il des compilateurs sans la bibliothèque standard groupée? C'est à dire. Il ne compile que le code écrit dans sa langue sans support pour la bibliothèque standard? C'est à dire. Vous devez écrire des fonctions pour tous vos besoins. Je ne peux pas imaginer cela, la raison est, sans malloc () ou gratuit () Comment le programmateur sera-t-il de la mémoire (Stack ne suffit-il pas toujours, je suppose)? Sans avoir une interruption / signal (Signal.h), comment l'utilisateur gérera-t-il des signaux du système d'exploitation?
@ Legends2k: Il n'y a aucune raison de ne pas croire que l'exemple de Yossarian. Cependant, l'avis général tient - pour quelque chose comme NULL, jetez un coup d'œil autour de vous avant de la réinventer. Il y avait un moment où beaucoup de CS n'avaient pas de null (ESP quand il était simplement défini comme 0 code>). Mais il y a toujours quelque chose qui appelle principale () et vous donne des trucs comme une allocation comme si vous suggérez (bien que l'on ne puisse supposer que les capacités de mémoire dynamiques soient disponibles ou nécessaires). Point est tout ce morançon est très loin de l'origine du questionneur maintenant. ESP lorsque même envisager C et C ++ ensemble (et C ++ est beaucoup moins susceptible de ne pas avoir de stdlib)
Cette discussion est tombée dans une personne qui se dispute sur le noir est blanche il y a longtemps, mais ne va pas chercher des pépites d'informations perspicaces dans cette tempête de neige! (Si vous cherchez simplement à avoir votre avis confirmé, je suis d'accord, si vous cherchez à fournir des munitions, je m'ennuie!)
Soigné. Compris clairement! Merci d'avoir pris le temps d'expliquer. (Eh bien, je suis une nouvelle recrue, pas de munitions ici;)
@ Legendend2k: Bien que au moins quelque chose de bien est venu de tout cela à la fin - merci pour les mots aimables; Bonne chance!
I Par exemple, j'ai besoin de définir NULL dans une tâche qui n'a pas la norme (bien) des bibliothèques autorisées.
Je pense que quiconque qui ne sait pas que définir un pointeur en C / C ++ à 0 est le même que de le régler à NULL, NULLPTR ou tout autre équivalent ne doit pas être en train de gâcher avec code. La différence de lisibilité entre et p> est minimale. En ce qui concerne les expressions, les formulaires p> ne sont plus lisibles que p>
@lilburne: apportant NullPtr dans vos exemples de boues choses plutôt que de les clarifier. Nullptr a un but et n'est pas toujours interchangeable à 100% avec NULL. Mais je suis d'accord avec le point général que, pour la plupart des usages, il faut envisager de préférer 0 code> et une copererciation implicite à int to
null code>. (Mais cela ne reçoit pas un +1 de moi pendant que cela confond ces problèmes: D)
Contrairement à ce que certaines personnes énoncent ici, 0 est une définition parfaitement valide pour NULL en C. Vous devez donc faire attention lorsque vous donnez à NULL comme un argument à une fonction variadique, car il peut être confondu comme une valeur entière. 0, finissant par non-portabilité. P>
http://c-faq.com/null/null2.html p>
BTW, la FAQ Comp.Lang.ca est une lecture très recommandée pour chaque programmeur C. Voir par exemple ici: P>
http://c-faq.com/null/null1.html p>
contenant de telles gemmes de sagesse presque oubliée comme "Comme mentionné ci-dessus, il existe un pointeur NULL pour chaque type de pointeur et les valeurs internes des pointeurs NULL pour différents types peuvent être différents." Ce qui signifie que calloc ou membre n'est pas une initialisation portable pour les pointeurs. P>
ne fais pas cela. strong> Cela pourrait être une valeur qui représente la fin de la mémoire, une place spéciale en mémoire, voire un objet qui ne représente aucune valeur n'existe. s> p>
Faire cela est très dangereux, peut casser la portabilité et vis-à-vis des éditeurs sensibles au code. Il ne vous a rien acheté, faites confiance à la définition de votre bibliothèque. P>
EDIT: Evan est correct! I> Le code lui-même dira de zéro, sous la hotte, le compilateur peut faire ce qu'il veut avec des détails spécifiques à la mise en œuvre. Merci Evan! P> Il n'y a rien qui dit que NULL doit être la valeur zéro, sa mise en œuvre spécifique. P>
Ceci est une interprétation courante de la norme. La constante de pointeur NULL est b> 0. Cependant la valeur du pointeur NULL (non exposée à un niveau de langue, donc jamais votre préoccupation) peut être spécifique à la machine. C99 Standard 6.3.2.3: "Une expression constante entier avec la valeur 0, ou une telle expression moulée à type vide *, est appelée une constante de pointeur null.55) Si une constante de pointeur NULL est convertie en type pointeur, le pointeur résultant , appelé un pointeur NULL, est garanti de comparer inégal à un pointeur à n'importe quel objet ou fonction. " Qui dit essentiellement "0 utilisé dans un contexte de pointeur est null."
Voir aussi: Stackoverflow.com/questions/423823/... et C-FAQ .com / null / machnon0.html
@Walt: pas de problème, je vais supprimer mon -1 maintenant :-).
#include <cstddef>
Quelle langue? C ou C ++, ce sont des langues très différentes
Et pourquoi pensez-vous que vous devez faire cela?
Pouvez-vous modifier le nom de la variable CH à quelque chose d'autre (comme
STR code>) car il est susceptible de confondre une personne qui la lit rapidement qui pourrait déduire que vous êtes intéressé par Nul Maniping s'il vous plaît. (Mais ma vraie question est (comme @Neil Butterworth a demandé), pourquoi?) (Ou pouvez-vous clarifier ce que vous espérez atteindre? Êtes-vous en train d'essayer d'avoir une seule constante manifeste avoir une double tâche comme un pointeur et un personnage de Nul ?
Tandis qu'il s'agit que c'est juste une mauvaise question, car vous ne devriez certainement pas le faire. Peut-être que si vous expliquez quelle est votre motivation, la justification pourrait être plus claire?
@Daemon: 6 upvotes disent que c'est une excellente question: P (seulement ajouté mon -1 ... @cppdev: N'oubliez pas de répondre à tous les suivis générés!)
C'est une question inquiétante - indicative de faire quelque chose de mauvais.