0

私は現在、このコードを持っています:

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 );  
}

関数呼び出しでキャストを回避する方法はありますか?

4

3 に答える 3

4

変数にポインターを渡そうとしていると思いますが、質問を編集しているときに、単純化するためにポインター宣言を削除しましたが、質問も変更されました。関数に値を渡す場合、問題はありません。

ここで、ポインターを渡す場合、volatile 修飾子は、コンパイルされたコード以外の方法で変数の値が変更されることをコンパイラーが予期する必要があることを伝えます。volatile 変数を非 volatile パラメータとして関数に渡すべきではありません。volatile パラメータを持つように関数自体を変更し、再コンパイルする必要があります。次に、volatile 変数を処理する関数 (volatile パラメータを使用) を準備します。

于 2009-09-24T18:55:37.357 に答える
0
#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 を使用してコンパイルされます。(実際に関数を定義し、ヘッダー ファイルをインクルードする必要がありました。)

于 2009-09-24T18:57:02.657 に答える
0

明示的にキャストする必要はありません。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 );  
}
于 2009-09-24T18:52:18.563 に答える