2013/11/13

XC8コンパイラの罠

1wireのライブラリでも作ろうと思ってstructを隠蔽しました。C言語ではよく使われるテクニックで、

ヘッダーファイルtest.h内で次のように宣言します。

struct _Test; // 構造体の中は宣言しない
typedef struct _Test Test; // Testでクラスのように使えるようにする

Test* Test_initialize(char n); // コンストラクタ
char Test_get_n(Test* self, void); // nを取得

あとはtest.cで実体を宣言します。

struct _Test {
 char n;
}

Test* Test_initialize(char n) {
 // メモリ確保処理が終わってTest* testが割り当てられたとする
 test->n = n;
 return test;
}

char Test_get_n(Test* self, void) {
 return self->n;
}

ところがこれはコンパイルが通りません。(メモリ確保処理は別として)どうやらXC8コンパイラでは隠蔽はできないようです。VC++ではできることを確認しました。

onewireについては後で書きます。

0 件のコメント:

コメントを投稿