2011-03-09 2 views
3

C++ est très pratique dans la plupart des projets, mais il suffit parfois de l'intégrer aux fonctions de style C existantes.Intégration de C++ dans l'infrastructure C

Comment faites-vous cela d'une manière ordonnée, surtout si vous travaillez avec des chaînes de caractères?

J'avais une idée que je pouvais utiliser construire comme ceci:

std::string buffer; 
buffer.resize(1024); 

GetBackCStyleString(&buffer[0], 1024); 

Mais cela pose des problèmes de longueur de chaîne, car elle renvoie la longueur redimensionnée. Existe-t-il un meilleur moyen d'intégrer les fonctions C dans le code C++?

Répondre

1

C'est une bonne solution. Si vous voulez que la taille soit précise, appelez resize après la fonction retourne et vous pouvez calculer la longueur réelle.

par exemple.

buffer.resize(GetBackCStyleString(&buffer[0], buffer.size()); 

si la fonction renvoie la longueur, ou

GetBackCStyleString(&buffer[0], buffer.size() 
buffer.resize(strlen(&buffer[0])); 

autrement.

0

buffer.c_str() si la fonction prend const char* ou const_cast<char*>(buffer.c_str()) si la fonction prend char*. Dans ce dernier cas, soyez prudent

+0

@BenVoigt: Et c'est garanti indirectement en C++ 03, grâce à quelques bogues standards. :) –

+0

De plus, '& buffer [0]' préserve const-justity et 'const_cast (buffer.c_str())' ne le fait pas. –

+1

@Tomalek, pouvez-vous expliquer votre commentaire? Comment C++ 03 garantit-il indirectement un tampon de chaînes inscriptible? –

0

Créez un tampon char somebuf[somesize]; et laissez la fonction C écrire dedans. Créez ensuite un std::string à l'aide de std::string buffer(somebuf).

Si la fonction nécessite simplement un const char * (c'est-à-dire un paramètre "entrée"), passez-lui simplement yourStdString.c_str().

+3

copies supplémentaires inutiles –