私は現在、このコードを持っています:
static void func( uint8_t var );
static volatile uint8_t foo;
int main() {
/* Here we have to cast to uint8_t */
func( (uint8_t) foo );
/* This will not compile */
func( foo );
}
関数呼び出しでキャストを回避する方法はありますか?
変数にポインターを渡そうとしていると思いますが、質問を編集しているときに、単純化するためにポインター宣言を削除しましたが、質問も変更されました。関数に値を渡す場合、問題はありません。
ここで、ポインターを渡す場合、volatile 修飾子は、コンパイルされたコード以外の方法で変数の値が変更されることをコンパイラーが予期する必要があることを伝えます。volatile 変数を非 volatile パラメータとして関数に渡すべきではありません。volatile パラメータを持つように関数自体を変更し、再コンパイルする必要があります。次に、volatile 変数を処理する関数 (volatile パラメータを使用) を準備します。
#include <stdint.h>
static void func( uint8_t var ){}
static volatile uint8_t foo;
int main() {
/* Here we have to cast to uint8_t */
func( (uint8_t) foo );
/* This will not compile */
func( foo );
}
これは、gcc を使用してコンパイルされます。(実際に関数を定義し、ヘッダー ファイルをインクルードする必要がありました。)
明示的にキャストする必要はありません。2 番目の形式は、標準に準拠したすべての C コンパイラで完全に有効です。
キャストする必要があるのは、次のようなものだけです。
static void func( uint8_t *var );
static volatile uint8_t foo;
int main() {
/* Here we have to cast to uint8_t */
func( (uint8_t*) &foo );
/* This will not compile */
func( &foo );
}