構造体 C言語の例

構造体

出典: フリー百科事典『ウィキペディア(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++以外の他の言語向けバインディング(ラッパーライブラリ)を記述することも容易になる。




「構造体」の続きの解説一覧




構造体と同じ種類の言葉


固有名詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「構造体」の関連用語

構造体のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



構造体のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアの構造体 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2024 GRAS Group, Inc.RSS