我正在编写一个访问函数,它返回一个指向内部缓冲区的指针,我想向我的函数的用户提示他们不应该更新指向的对象。一个非常人为的例子是:
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)确实抱怨丢弃了限定符。