開発者が Pebble アプリの作成に比較的慣れていない場合(または一般的に C 言語に慣れていない場合)、アプリのコードの問題がコンパイルエラーを引き起こすことがあります。コード自体の一部のタイプのエラーはコンパイラによって検出でき、これにより、コードが Pebble 上で実行されたときに問題を引き起こすエラーの数を減らすことができます。
これらは、アプリコードの書き方に関する問題であり、ランタイムエラー(Common Runtime Errors で説明)とは対照的です。ランタイムエラーには、C 言語のルールを破ったり、コンパイラが検出してエラーとして表示できる悪い慣行が含まれる場合があります。以下にいくつかの例を示します。
このエラーは、参照された変数が現在のスコープで使用できないことを意味します。
../src/main.c: In function 'toggle_logging':
../src/main.c:33:6: error: 'is_now_logging' undeclared (first use in this function)
if(is_now_logging == true) {
^
上記の例では、シンボル is_now_logging が toggle_logging 関数で使用されていますが、最初にそこで宣言されていません。これは、宣言行が削除されたか、グローバルに使用できると予想されていたが、そうではないためである可能性があります。
これを修正するには、シンボルが他のどこで必要かを検討してください。他の関数で必要な場合は、宣言をグローバルスコープ(任意の関数の外部)に移動します。この関数にのみ必要な場合は、問題のある行(ここでは行 33)の前で宣言してください。
上記の問題の別のバリアントは、コードファイルで新しい関数を宣言するときに発生する可能性があります。C コンパイルの性質上、開発者が呼び出そうとする関数は、表示されるためにコンパイラによって以前に検出されている必要があります。これは、前方宣言を通じて行うことができます。
たとえば、以下のコードセグメントはコンパイルされません:
static void window_load(Window *window) {
my_function();
}
void my_function() {
// Some code here
}
コンパイラは、アプリが関数を呼び出すことで関数の存在を暗黙的に示しているにもかかわらず、コンパイラが以前にそれを見たことがないため、「暗黙の宣言」エラーでこれを報告します:
../src/function-visibility.c: In function 'window_load':
../src/function-visibility.c:6:3: error: implicit declaration of function 'my_function' [-Werror=implicit-function-declaration]
my_function();
^
これは、my_function() の宣言が window_load() で呼び出された後に発生するためです。これを修正するには、2 つのオプションがあります。
void my_function() {
// Some code here
}
static void window_load(Window *window) {
my_function();
}
void my_function();
static void window_load(Window *window) {
my_function();
}
void my_function() {
// Some code here
}
引数リストを持つ関数を作成するとき、関数の要件が変更され、開発者がそれが呼び出される場所を更新するのを忘れることがあります。
../src/main.c: In function 'select_click_handler':
../src/main.c:57:3: error: too few arguments to function 'toggle_logging'
toggle_logging();
^
../src/main.c:32:13: note: declared here
static void toggle_logging(bool will_log) {
^
上記の例は、アプリが 57 行目の select_click_handler() で toggle_logging() 関数を呼び出そうとしたが、十分な引数を提供しなかったことを報告しています。関数定義で期待される引数リストは、出力メッセージの 2 番目の部分に示されており、ここでは 32 行目に存在し、bool タイプの追加の値を期待しています。
これを修正するには、どのバージョンの関数が必要かを確認し、一致するように呼び出しまたは宣言を更新します。
Pebble SDK には、開発者が WindowHandlers オブジェクトのコールバックなど、コールバックに必要な関数シグネチャを実装する必要がある多くのインスタンスがあります。つまり、ハンドラーを実装するとき、開発者定義のコールバックは、API ドキュメントで指定された戻り値の型と引数リストと一致する必要があります。
たとえば、WindowHandler コールバック(Window のライフサイクルの load および unload イベントに使用)には、次のシグネチャがあります:
typedef void(* WindowHandler)(struct Window *window)
これは、void の戻り値の型と、Window タイプのポインタである単一の引数を指定します。したがって、実装されたコールバックは次のようになります:
void window_load(Window *window) {
}
開発者がコールバック実装で正しい戻り値の型と引数リストを指定しない場合、コンパイラは次のようなエラーで通知します。これは、開発者が渡した関数の型が期待される型と一致しないことを示しています:
../src/main.c: In function 'init':
../src/main.c:82:5: error: initialization from incompatible pointer type [-Werror]
.load = main_window_load,
^
../src/main.c:82:5: error: (near initialization for '(anonymous).load') [-Werror]
これを修正するには、提供された実装が API ドキュメントで指定されたものと同じ戻り値の型と引数リストを持っていることを再確認してください。