0

次の署名を持つ関数を持つライブラリを使用しています。

void LED_stop_blink_task ( void * callback_parameter );

voidポインターが表す実際のパラメーターは、ボード上のLEDの番号であるuint32_tへのポインターです。

データを保持するために変数を使用せずにこの関数を呼び出す方法はありますか?私の想像では、それは次のようになります

LED_stop_blink_task(&35);

または、唯一の方法は次のようになります。

uint32_t led_num = 35;
LED_stop_blink_task(&led_num);

なぜ変数を捨てたいのかと聞かれたら、それが可能かどうか知りたいだけです...

4

2 に答える 2

4

intほとんどのプラットフォームでは、単純にvoid *:に詰め込むことができます。

LED_stop_blink_task((void *)32);

次に、関数でにキャストできますint

整数は任意のポインタ型に変換できます。以前に指定された場合を除き、結果は実装定義であり、正しく整列されていない可能性があり、参照されたタイプのエンティティを指していない可能性があり、トラップ表現である可能性があります。

任意のポインタ型を整数型に変換できます。以前に指定された場合を除き、結果は実装によって定義されます。結果を整数型で表現できない場合、動作は定義されていません。結果は、整数型の値の範囲内である必要はありません。

実際には、これはPOSIXがサポートされているすべてのプラットフォームで機能します。たとえば、TLPIは次のように述べています。

厳密に言えば、C標準はintをvoid*にキャストした結果を定義していません。その逆も同様です。ただし、ほとんどのCコンパイラはこれらの操作を許可しており、目的の結果を生成します。つまり、int j ==(int)((void *)j)です。

于 2012-08-19T12:21:25.037 に答える
1

Cnicutar の答えはほぼ完璧です。実際には移植可能ではないことを拡張させてください-intはポインターと同じサイズ(または小さい)であることが保証されていないため、代わりにintptr_torを使用する必要がありますuintptr_t

于 2012-08-19T12:29:36.663 に答える