Я пишу функцию доступа, которая возвращает указатель на внутренний буфер, и я хотел бы намекнуть пользователям моей функции, что они не должны обновлять объект, на который указывает. Очень надуманный пример:
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);
Да, я знаю, это выглядит глупо.
То, что я хочу предотвратить, это:
char* s;
size_t bytes;
myAccessFunc(true,&s,&bytes);
s[4] = '?';
Я знаю, что не могу полностью предотвратить это, но я бы по крайней мере хотел, чтобы компилятор предупреждал пользователя о том, что он не должен этого делать. Если они приведут мой указатель, то это их проблема. Есть ли какая-нибудь комбинация const и void и *, которая сделает это? Я пробовал что-то вроде:
void myAccessFunc(bool string, const void** p, size_t* len);
но, похоже, он покончил с пустотой указателя, поэтому вызывающий должен был сделать:
const void* p;
size_t bytes;
myAccessFunc(true, &p, &bytes);
или
const char* s;
size_t bytes;
myAccessFunc(true, (const void**)&s, &bytes);
и не мог сделать:
const int * ip;
const char* s;
size_t bytes;
myAccessFunc(true, &s, &bytes);
myAccessFunc(false, &i, &bytes);
Я наконец пришел к:
const void* myAccessFunc(bool string, size_t* len);
и если пользователь делает:
char* p = myAcccessFunc(true,&bytes);
компилятор (по крайней мере, GCC) жалуется на то, что выбросил классификатор.