J'écris une fonction d'accès qui renvoie un pointeur vers un tampon interne et je voudrais faire savoir aux utilisateurs de ma fonction qu'ils ne devraient pas mettre à jour l'objet pointé à. Un exemple très artificiel serait:Retour d'un pointeur vide sur un objet constant dans C
void myAccessFunc(bool string, void* p, size_t* len)
{
static const char* s = "aha!";
static const int i = 123;
if (string) {
*(char**)p = &s;
*len = strlen(s);
}
else {
*(int**)p = &i;
*len = sizeof(i);
}
}
char* s;
size_t bytes;
myAccessFunc(true,&s, &bytes);
printf("Got '%s'\n", s);
Oui, je sais que l'aspect flakey.
Ce que je veux éviter est:
char* s;
size_t bytes;
myAccessFunc(true,&s,&bytes);
s[4] = '?';
Je sais que je ne peux pas empêcher complètement, mais je au moins comme l'avertissement du compilateur de faire allusion à un utilisateur qu'ils ne devraient pas faire que . Si ils jettent mon pointeur, alors c'est leur problème. Y a-t-il une combinaison de const et void et * qui le fera? J'ai essayé quelque chose comme:
void myAccessFunc(bool string, const void** p, size_t* len);
mais il semblait en finir avec le pointeur de la vacuité si un appelant a dû faire:
const void* p;
size_t bytes;
myAccessFunc(true, &p, &bytes);
ou
const char* s;
size_t bytes;
myAccessFunc(true, (const void**)&s, &bytes);
et ne pouvait pas faire :
const int * ip;
const char* s;
size_t bytes;
myAccessFunc(true, &s, &bytes);
myAccessFunc(false, &i, &bytes);
Je suis finalement venu à :
const void* myAccessFunc(bool string, size_t* len);
et si l'utilisateur fait:
char* p = myAcccessFunc(true,&bytes);
le compilateur (GCC, au moins), ne se plaindre de jeter le qualificatif.
Merci. Je pense que la guérison est pire que la maladie. –
Pourquoi pas un «vide»? (<- Ajouter 'const's comme désiré) –