昨日、この質問をしているときに、名前のない構造体を関数パラメーターとして受け渡しする奇妙なケースを見つけました。
たとえば、このような構造がある場合、
int main ()
{
struct {
int a;
} var;
fun(&var);
}
さて、 の原型はどうあるべきfun
か?そして、その構造を関数内の構造(ポインター)として使用するにはどうすればよいfun
ですか?
昨日、この質問をしているときに、名前のない構造体を関数パラメーターとして受け渡しする奇妙なケースを見つけました。
たとえば、このような構造がある場合、
int main ()
{
struct {
int a;
} var;
fun(&var);
}
さて、 の原型はどうあるべきfun
か?そして、その構造を関数内の構造(ポインター)として使用するにはどうすればよいfun
ですか?
配置上の理由から、このプロトタイプは機能するはずです。
void fun(int *x);
そしてもちろん:
void fun(void *x);
関数内で実際に構造を効果的に使用する簡単な方法がわかりません。おそらく、その関数内で再度宣言してから、void *
?
6.7.2.1 - 15
適切に変換された構造体オブジェクトへのポインターは、その最初のメンバー(または、そのメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。構造体オブジェクト内に名前のないパディングがある場合がありますが、先頭にはありません。
fun
として定義することもできますvoid fun(void* opaque);
。ただし、これは、パラメーターを宣言するvoid*
と型情報が取り除かれるため、良い方法とは見なされません。また、渡されたパラメーターを解釈する必要があります。これは、一連のバイトへのポインターになるためです。何らかの方法で構造体のサイズも渡す必要があります。
このプラクティスは、構造体のサイズ (通常は dwSize などの名前) を指定する構造体にフィールドがある WIN32 API で一般的です。これは、構造定義のバージョンに関する情報を伝えるのにも役立ちます。
ここで考慮すべきもう 1 つのことは、コンパイラーおよびプラットフォームに依存する構造パッキングです。