構造体
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/11/02 18:42 UTC 版)
C言語の例
下記は単純な例示のため、バッファオーバーフローや整数オーバーフローなどは考慮していないことに注意されたい。
#include <stdio.h>
/* PersonalDataを構造体として定義 */
struct PersonalData
{
/* メンバー変数 (つまり構造体の要素) を名前と年齢とする */
char Name[100];
int Age;
};
/* 上で定義された構造体を使ってみる */
int main(void)
{
struct PersonalData pd; /* 構造体変数の宣言 */
struct PersonalData *ppd; /* 構造体へのポインタ */
scanf("%s", pd.Name); /* 値を入力 */
scanf("%d", &(pd.Age)); /* 値を入力 */
ppd = &pd;
ppd->Age++; /* ポインタの参照先のメンバーにアクセスするにはアロー演算子->を使う。*/
printf("%s-%d\n", pd.Name, pd.Age);
return 0;
}
下記は構造体へのポインタをユーザー定義のオブジェクト型のハンドルとして利用する例である。
/* MyObject.h */
/* 構造体の前方宣言 */
typedef struct MyObject MyObject;
extern MyObject* MyObject_create(void); /* コンストラクタの代替 */
extern void MyObject_destroy(MyObject* obj); /* デストラクタの代替 */
extern void MyObject_setPosition(MyObject* obj, double x, double y);
extern void MyObject_getPosition(const MyObject* obj, double* outX, double* outY);
/* MyObject.c */
#include <stdlib.h>
#include <assert.h>
#include "MyObject.h"
/* 構造体の定義 */
struct MyObject {
double x, y;
};
MyObject* MyObject_create(void) {
return calloc(1, sizeof(MyObject));
}
void MyObject_destroy(MyObject* obj) {
free(obj);
}
void MyObject_setPosition(MyObject* obj, double x, double y) {
assert(obj);
obj->x = x;
obj->y = y;
}
void MyObject_getPosition(const MyObject* obj, double* outX, double* outY) {
assert(obj && outX && outY);
*outX = obj->x;
*outY = obj->y;
}
近代的なAPI設計では、このようにしてC互換のオブジェクト指向インターフェイスを定義することがよくある。例えばOpenCL[10]やVulkan[11]などで類似の手法が実際に利用されている。ヘッダーでは構造体の前方宣言だけをすることにより、構造体の具体的な詳細(定義)はAPIのユーザーからは隠蔽されており、不透明な型 (opaque type) として扱われる(カプセル化)。
この手法を使うことで、C互換のインターフェイスを維持しつつ、API関数の実装をCだけでなくC++や他の言語で記述することもできるようになる。また、オブジェクトの生成・破棄を含むあらゆる操作をAPI関数経由に限定し、オブジェクトハンドルを介した操作のみを提供することで、異なるABI間でも正しくオブジェクトをやりとりすることができるため、C/C++以外の他の言語向けバインディング(ラッパーライブラリ)を記述することも容易になる。
注釈
- ^ データクラスのすべてのプロパティを
val
で宣言することで、イミュータブルにすることもできる。
出典
- ^ User-defined data type (VBA) | Microsoft Docs
- ^ レコード・クラス | Oracle Java SE 16 Help Center
- ^ Java 16の最新情報 | InfoQ
- ^ データクラス - Kotlin Programming Language
- ^ a b 構造体型 - C# リファレンス | Microsoft Docs
- ^ a b クラス - C# プログラミング ガイド | Microsoft Docs
- ^ a b Structure ステートメント - Visual Basic | Microsoft Docs
- ^ 構造体とクラス(Structures and Classes) · The Swift Programming Language日本語版
- ^ Structures and Classes — The Swift Programming Language (Swift 5.6)
- ^ OpenCL-Headers/cl.h at master · KhronosGroup/OpenCL-Headers
- ^ Vulkan-Headers/vulkan_core.h at master · KhronosGroup/Vulkan-Headers
- ^ Choosing Between Class and Struct - Framework Design Guidelines | Microsoft Docs
- ^ Parameterless struct constructors - C# 10.0 draft specifications | Microsoft Learn
- ^ Structures - F# | Microsoft Docs
- ^ ref class and ref struct (C++/CLI and C++/CX) | Microsoft Docs
- ^ StructLayoutAttribute Class (System.Runtime.InteropServices) | Microsoft Docs
- ^ Storage and Alignment of Structures | Microsoft Docs
構造体と同じ種類の言葉
固有名詞の分類
- 構造体のページへのリンク