内部バッファへのポインタを返すアクセス関数を作成しています。関数のユーザーに、ポイントされているオブジェクトを更新してはならないことを示唆したいと思います。非常に不自然な例は次のとおりです。
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)は、修飾子を破棄することについて文句を言います。