答えて
私はこれをコンパイルすると、私が手:
$ gcc foo.c
foo.c:3:5: warning: incompatible pointer to integer conversion initializing 'int' with an expression of type 'void()' [-Wint-conversion]
int i = f;
^ ~
foo.c:3:9: error: initializer element is not a compile-time constant
int i = f;
^
1 warning and 1 error generated.
は本当に、私は警告がエラーであるべきだと思います。あなたは整数にアドレスを入れようとしていますが、それは一般的に悪い形です。
つまり、コンパイラが先に進んで変換を行うと、その結果はコンパイル時定数ではない(変換された値なので)。したがって、エラー。
C++について質問しているわけではありませんが、私は2つの言語がどう違うか興味がありましたので、コンパイラの動作を確認しました。その言語では、f
の両方の割り当ては正当な理由で不正です。 void*
は、パラメータなしの関数へのポインタではなく、int
もポインタではありません。 v
とi
両方の
$ g++ foo.c
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
foo.c:2:7: error: cannot initialize a variable of type 'void *' with an lvalue of type 'void()'
void* v = f;
^ ~
foo.c:3:5: error: cannot initialize a variable of type 'int' with an lvalue of type 'void()'
int i = f;
^ ~
2 errors generated.
これらの割り当てはCでも許されません。問題は、C++ではなくCについてです。 – Lundin
あなたはそれがCの質問であることについて正しいです。私は自分の好奇心のために追加しただけであることを明確にしています。 私はさまざまなC言語の方言を試して、関数をvoid *に変換することについて不平を言うかどうかを調べました。もちろん、これはclangのバグかもしれませんが、私はそれが不許可ではなく未定義の動作である可能性が高いと思う傾向があります。 'GCC -stc = C90 foo.c'、 'GCC -std = iso9899::1999 foo.c'、 ' GCC -std = iso9899:2011 foo.cを 具体的には、これらの全ては、同じ結果が得られました' – burlyearly
初期化は違法です。
ただし、一部のコンパイラでは、関数ポインタからコンパイラ拡張としてvoid*
に変換することができます。
あなたの警告でコンパイルを試してみてください(あなたが慣れているように)、void* v = f;
行でも警告が表示されることがあります。関数f
へのポインタを格納する
正しい方法は、ファイルスコープで宣言
void (*p)() = f;
変数(「グローバル」)静的記憶持続時間を有するであろう。
静的記憶期間を持つすべての変数は、コンパイル時定数に初期化する必要があります。 Cでは、他の変数(even
const
もありません)はコンパイル時定数としてカウントされないため、エラーになります。さらに、整数へのポインタを割り当てることはできません。これは有効ではありません。ポインタをキャストすることで、手動でポインタを整数型に手動で変換する必要があります。
さらに、キャスト
void* v = f;
は明確に定義されていません。 C標準は、void*
とオブジェクト型へのポインタの間のキャストのみを指定します。
今、あなたは、関数のアドレスを取得するために何をすべきか、このです:
#include <stdint.h>
uintptr_t i = (uintptr_t) f;
int main (void)
{ ...
uintptr_t
は、任意のポインタのアドレスを格納するのに十分な大きさであることが保証されます。あなたが本当にint
へのポインタの基礎となるビットを入れたい場合
あなたはこれを試みることができる:
typedef union _UPTRINT
{
void *ptr;
int i;
} UPTRINT;
が続いi
としてそれをUPTRINT::ptr
に関数ポインタを割り当て、アクセス(ポインタとints
があると仮定してお使いのプラットフォームで同じサイズ、必要に応じてi
のタイプを調整します)。
- 1. C++ストア機能は
- 2. Javascript:localstorageのストア機能
- 3. 機能の2つのアドレス
- 4. PHPのメール機能 'from'アドレス
- 5. ストアの国コードとアドレス
- 6. Extjsグリッドカラムレンダリング機能、外部ストアへのアクセス
- 7. IP予約アドレスのチェックの機能
- 8. 機能V8 ::値は:: IsInt32は何のアドレス
- 9. Firefox拡張機能のIPアドレス検索
- 10. 特定のアドレスへのリンク機能
- 11. getJSONは一部のアドレスでは機能しますが、他のアドレスでは機能しません
- 12. 既存のATG CRSストアの機能拡張
- 13. 製品woocommerceストアでボタンが機能しない
- 14. Laravelのストア機能一意のIDを取得
- 15. ヘルパー機能でVuexストアにアクセスするには?
- 16. Chrome拡張機能データを自動的にプル&ストアする
- 17. 検索機能付き文書ストアの作成
- 18. 上書きAzureの機能表ストアの行出力
- 19. Hololensストア送信入力が機能しない
- 20. このアドレスはどの機能を指していますか?
- 21. jqx - アドレス列のグリッドソートが機能しない
- 22. Excel VBAでアドレス機能を使用するには?
- 23. シンプル$ .getJSON(「アドレス」)、機能(RES)は、{私が簡単な関数持っ
- 24. Googleプレイスのアドレス検索が機能しない
- 25. IPv6 IPアドレスを持つRewriteRuleが機能しない
- 26. R内から自分のIPアドレスを取得する機能?
- 27. iOS9のWKWebviewがWebSocketと機能しないraw IPアドレス
- 28. 機能のアドレスを取得するには?
- 29. ラズベリー・パイ3メモリ・バイト・アドレス可能かワード・アドレス可能かワード・アドレス可能ならワードサイズは
- 30. Reactuxストアの状態の変更が機能していません
パイソンのネストに象を置くことはできません。ところで、グローバルオブジェクトの初期化は一定でなければなりません。 – haccks
誰がintに変数のアドレスを格納できると言ったのですか?言い換えれば、 'sizeof(int)'は 'sizeof(void *) 'と同じですか? – LPs
なぜあなたはそれをしたいですか?あなたはこのための関数ポインタを持っています – sas