De retour d'un vide C-String
Question Simple:
Comment voulez-vous retourner un vide C-String avec aussi peu de code que possible?
J'ai un code qui doit retourner un vide char*
. Je suis à la recherche de quelque chose le long des lignes de return "";
. Je sais qu'il ya plusieurs façons de le faire, mais je suis à la recherche de la manière la plus efficace possible.
À l'aide de return "";
donne warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
Merci!
Quel genre de l'efficacité que vous recherchez? Le PROCESSEUR, la mémoire, statique segment de votre application ou moins de code?
Quel est le prototype de fonction à partir de laquelle vous voulez revenir? Si c'est
Il est de savoir si l'appelant n'a
Cela permettrait d'éviter la dépréciation: const char* s=""; return s;
Waouh, c'est une toute autre question. Regardez memset() pour initialiser une chaîne de caractères. Ex.
Quel est le prototype de fonction à partir de laquelle vous voulez revenir? Si c'est
char *foo()
, je ne connais pas de moyen plus court que return ""
, depuis ""
est un littéral et l'éditeur de liens peut-il donner une adresse. Si vous êtes de retour d'un objet, il y a des conversions implicites à prendre en compte.Il est de savoir si l'appelant n'a
*foo() = 'a'
.Cela permettrait d'éviter la dépréciation: const char* s=""; return s;
Waouh, c'est une toute autre question. Regardez memset() pour initialiser une chaîne de caractères. Ex.
char str[256]; memset(str,0,sizeof(str));
.OriginalL'auteur Evorlor | 2013-10-19
Vous devez vous connecter pour publier un commentaire.
Réponse Courte:
ou
ou
ou
Réponse Détaillée:
Conversion implicite de chaîne littérale
char *
est pris en charge par le C et le C++98/C++03, mais apparemment pas en C++11. La dépréciation d'avertissement est juste là pour vous faire savoir que cette question devrait être abordée, en particulier si vous voulez être en mesure de migrer votre code C++11.Le littéral de chaîne vide ("") n'est pas réellement vide, c'est une chaîne contenant un seul caractère nul (\0). Lorsque vous utilisez
return "";
, vous êtes réellement en retournant un pointeur vers l'emplacement de mémoire de la const littéral de chaîne de sorte que la fonction de type de retour doit êtreconst char *
.Si vraiment vous devez retourner un non-const pointeur vers une chaîne littérale, vous pouvez utiliser le
const_cast
opérateur de cast away laconst
.Une meilleure pratique serait de retourner la valeur NULL (ou
nullptr
) pour les fonctions qui sont les retours à vide, non-const, C-style chaînes, mais seulement si le code d'appel est la vérification des pointeurs NULL.Remarque que le C++ dispose de son propre type de chaîne (
std::string
), et encore mieux, il serait préférable de l'utiliser plutôt que d'un C-chaîne de style quand c'est possible.OriginalL'auteur Chris Olsen
Juste être conscient que cette fonction est absolument stupide, et quel que soit votre problème, ce n'est probablement pas la bonne solution. Mais, puisque vous refusez de les exposer sur votre problème, ici vous allez.
Il est null. Les variables statiques sont nécessaires pour être automatiquement initialisées à 0.
Je pense que Basilevs propose de réaffecter les
char
sur chaque appel de la fonction.Oh la droite. Qui a du sens.
Je dirais que vous n'avez pas vraiment voulez que la corruption fixe ici; vous voulez qu'il fixe à la source. Comme il est, quelqu'un de la modification de cette "chaîne" sera presque certainement également remplacer tout ce qui vient après. Si vous comme par magie fixer la chaîne à chaque fois, puis la corruption semble être causée par d'autres choses. Non, si vous allez à se préoccuper de la valeur de
empty[0]
, j'avais vraiment recommander valoir que c'est un NUL, plutôt que de définir à l'un.OriginalL'auteur Benjamin Lindley