Linuxカーネルプログラムの疑問:externとポインタの使い方

このQ&Aのポイント
  • Linuxカーネルプログラムでのexternとポインタの使い方について疑問があります。
  • 特に、「extern void task_exit( void );」と「void (*TaskExit)(void)=&task_exit;」の意味がわかりません。
  • task_exitのアドレスをTaskExitに渡しているのでしょうか?変数TaskExitはどこに宣言されているのかも分かりません。
回答を見る
  • ベストアンサー

これはキャスト?が行われているのでしょうか?

kijinと申します。Linuxカーネルのプログラムを読んでいて以下のことに疑問を持ってしまいました。 例えば、 extern void task_exit( void ); /*外部関数参照宣言*/ void (*TaskExit)(void)=&task_exit; という表現があった場合、1行目はよくわかるのですが、 2行目はどういう処理になるのでしょうか? 「task_exit」のアドレスを「*TaskExit」に渡している のでしょうか?であるとしても、TaskExit という変数は プログラム内のどこにも宣言されていません。 以上、お分かりになる方いらっしゃいましたら、お教え くださいませ。 よろしくお願いいたします。

  • kigin
  • お礼率64% (37/57)

質問者が選んだベストアンサー

  • ベストアンサー
  • zzzzzz
  • ベストアンサー率61% (70/113)
回答No.1

ただの関数ポインタの宣言&代入だと思いますが。 引数も戻り値もない関数へのポインタTaskExitを宣言して、 task_exitのアドレスを代入しています。

その他の回答 (2)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

> TaskExit という変数は、プログラム内のどこにも宣言されていません。 2行目自身が*TaskExitと言うポインターの宣言です。同時に初期値のセットも行なっています。

  • wr250zb
  • ベストアンサー率41% (7/17)
回答No.2

これは関数へのポインタを宣言してそこに関数のアドレスをセットしていますね。 なので2行目が宣言&代入(初期化)しています。 この後に TaskExit(); とやるとtask_exit()が実行されます。

関連するQ&A

  • SolarisとLinuxのグローバル変数の扱いについて

    Solaris用のソースをLinuxで使えるように変更したいのですが、 グローバル変数について以下のようなことが発生していて困っています。 なにか、コンパイルオプションなどで対応はできないものでしょうか? Solaris (CC)では 特にextern宣言しなくても同じシンボルの外部変数はコモンセグメントに1つだけ作成しコンパイル自体は正常である。 しかし、Linux (g++)では externを宣言しないと同じシンボルを再定義したことになりエラーとなる。 これにより、グローバル変数を多用しているプログラムはLinuxでうまくコンパイルができない。 しかし、単純にextern宣言での対応は難しい。 extern宣言は外部で定義してあるグローバル変数を参照する というものだがLinux では 1つの定義を意外は全てexternしなければ、2重定義エラーになってしまう。 つまり、実体が1つであとはそれを参照しているという形でなければいけない。 ところが、その実体をどこにするか特定することができない。 例えば、gというグローバル変数を仮定する。 A.c,B.c,C.cはその3つのソースよりAA.aという静的ライブラリを構成する。 gはA.cで定義してありB.c,C.cはそれを参照する。 ところが C.cは個別にC.oというオブジェクトで他からの呼び出しがあり 別LMにリンクされる。 その時C.c内のgは実体を失うことになり未定義となる。 つまり、どれが実体になるかは何にリンクするかで決まるため 実態を特定できない。 また、共通のヘッダにグローバル変数が定義されている場合も、重複するというエラーを起こすため、 共通ヘッダからグローバル変数を分離し、何れかのソースにグローバル変数の実態を定義させる必要がある。 共通ヘッダを使っている他のソースはそのグローバル変数の実態を参照するようにexternの宣言をする。

  • 外部変数について

    今Vine Linuxを使ってC++でプログラムを書いているのですが教えて頂きたいことがあります. C++の初心者の為,変なことをお聞きしますがお許しください. extern宣言で他のソースのローカル変数を参照する方法はないのでしょうか? 例えば,a.cとb.cというソースがあったとします. a.cの関数内でint i;と宣言されている変数をb.cからextern int i;という風にしたいのですが, こうするにはa.cでグローバル変数としてint i;を定義する以外方法はないのでしょうか? できればグローバル変数を使いたくないのですがこれ以外では無理でしょうか? あともう一つお聞かせ下さい. メイン関数の引数を別の関数,またはソースで使うということはできないのでしょうか? int main( int argc, char *argv[] )のargv[1]というのを別の関数で使用したいのですがこれも無理でしょうか? 馬鹿な質問だとは思いますが,どなたかお答え頂けますでしょうか? よろしくお願いします.

  • Cの変数の初期化のタイミングについて

    以下のようなCの演習プログラムについてお尋ねします。 やっていることは、inc_counterと言う関数を呼び出して呼び出すたびに変数を1つづつ増やすというもので、10回呼び出すので変数が10になるというものです。この演習プログラムが言いたいことは変数counterの動作ということです。 externですべての関数の外側で宣言されているから呼び出す側、呼び出される側で共通になっているということですが、void inc_couter(void)の実体(後方)の前にint counter=0;となっています。この文は変数counterの初期化ということだと思いますが、これが実行されるのはいつなのでしょうか。関数inc_counerの呼び出しのときは実行されないのでしょうか。もしそうなら関数が呼び出されるたびに初期化されるはずですが、そうではないのでしょうか。 変数のスコープとか初期化とかの問題だと思いますが、この辺を間違って理解すると大けがをしそうなのでお尋ねします。よろしくお願いします。 #include<stdio.h> extern int counter; void inc_counter(void); main() { int index; for(index=0; index<10; index++) inc_counter(); (void) printf("Counter is %d\n",counter); return (0); } int counter=0; void inc_counter(void) { counter++; }

  • 分割ファイルのコンパイルができない

    こんにちは。 mikroCというコンパイラを使い、 以下の2つのファイルをコンパイル 使用と思っていますが、 「init12f683が宣言されていない」、という エラーが出てしまいます。 プログラム的に問題あるでしょうか( コンパイラでは、ひとつのプロジェクト を作成し、両方そこに加えてあります)。 ----init12f683.c(自作関数) void init12f683(){ GPIO=0; CMCON0=0b00000111; ANSEL=0b01110000; TRISIO=0b00010000; } ----picc1.c(main) extern void init12f683(void);*宣言はここと、 void main(){ extern void init12f683(void);*ここで両方試しました。 init12f683(); Delay_ms(1000); while(1){ GPIO.F0=1 ; Delay_ms(1000) ; GPIO.F0=0 ; Delay_ms(1000) ; } } externでの関数の宣言は、mainの外に置く場合と、 中に入れる場合、両方試しています。 問題が、プロジェクトファイルの設定にあるのか、 プログラム的におかしいのか(どこがおかしいのか)、 知りたいです。 何か分かる人がいましたら、 よろしくお願いします。

  • visual c++ のグローバル変数宣言について

    visual c++で、 例えば下記のようにグローバル変数宣言するが 下記プログラムの「FileMei1[0][n1] = 0;」のところでブレークをかけてプログラムを走らせると、ウォッチウィンドウで「FileMei1エラー: 識別子 'FileMei1' はスコープ外です」とでてきます。 グローバル変数宣言のやり方間違っているのでしょうか? namespace TestCpp { extern char FileMei1[300][100]={ 0 }; public void aa{ for(n1=0; n1 < 100 ; n1++) { FileMei1[0][n1] = 0; } }

  • DLL内からの外部変数の参照

    BCC(フリーコンパイラ)で、WindowsAPIを使った プログラムを作成しています。その過程で、DLLを 作成しているのですが、 test.c を、 bcc32 -WD test.c とし、test.dllを作成しました。 さらにそれを、 implib test.lib test.dll で、test.libを作成ました。 ところが、おなじtest.cファイルで、ほかのファイル の変数を参照しようとして、extern HWND hWnd と書き加えたところ、bcc32 -WD で、参照先が見つか らないというエラーが起こり、DLLが作成できなく なってしまいました。 DLL内から外部の変数を参照するにはどうしたらよいで しょうか。この場合の外部の変数というのは、WinMain 関数のあるmain.cファイル内の静的変数です。 よろしくお願いいたします。

  • 複数ファイルで使うグローバル変数の位置

    メイン関数の処理で、関数A→関数B→関数Cという順序で関数が呼び出される場合(1関数1ファイルとします)、関数A,B,Cすべてで使用するグローバル変数の宣言を関数Bのファイルでおこなって、他のファイルではそれをexternするというのでも問題ないでしょうか?

  • CからC++の関数を使用するには

    C++からCの関数を参照する場合は extern "C"{ void test(void); } などと定義すれば可能なのですが、逆に C++で定義した関数をCで使うにはどのようにすれば よいのでしょうか?

  • VC++2005ExpressEditionでのエラー

    タイトルの通り、VC++2005EEでプログラムを作成しているのですが ビルド時にエラーが出てしまいます。 ------ ビルド開始: プロジェクト: Object, 構成: Debug Win32 ------ リンクしています... 3jjiki.obj : error LNK2019: 未解決の外部シンボル "int img_R" (?img_R@@3HA) が関数 "void __cdecl JikiLoad(void)" (?JikiLoad@@YAXXZ) で参照されました。 3jjiki.obj : error LNK2019: 未解決の外部シンボル "int img_C" (?img_C@@3HA) が関数 "void __cdecl JikiLoad(void)" (?JikiLoad@@YAXXZ) で参照されました。 3jjiki.obj : error LNK2019: 未解決の外部シンボル "struct BBB * bombig" (?bombig@@3PAUBBB@@A) が関数 "void __cdecl JikiInit(void)" (?JikiInit@@YAXXZ) で参照されました。 3jjiki.obj : error LNK2019: 未解決の外部シンボル "struct BBB * bom" (?bom@@3PAUBBB@@A) が関数 "void __cdecl JikiInit(void)" (?JikiInit@@YAXXZ) で参照されました。 3jjiki.obj : error LNK2019: 未解決の外部シンボル "struct SHOT_C * JitamaC" (?JitamaC@@3PAUSHOT_C@@A) が関数 "void __cdecl JikiShotC(void)" (?JikiShotC@@YAXXZ) で参照されました。 3jjiki.obj : error LNK2019: 未解決の外部シンボル "struct CharaData CharaData" (?CharaData@@3U0@A) が関数 "void __cdecl JikiShotC(void)" (?JikiShotC@@YAXXZ) で参照されました。 3jjiki.obj : error LNK2019: 未解決の外部シンボル "struct SHOT_R * JitamaR" (?JitamaR@@3PAUSHOT_R@@A) が関数 "void __cdecl JikishotR(void)" (?JikishotR@@YAXXZ) で参照されました。 I:\Works\Projects\Object\Debug\Object.exe : fatal error LNK1120: 外部参照 7 が未解決です。 ビルドログは "file://i:\Works\Projects\Object\Object\Debug\BuildLog.htm" に保存されました。 Object - エラー 8、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ========== 未解決のシンボルと言われているものは全てヘッダーファイルにて extern int img_C; の様に宣言しています。 あれこれ弄って見たのですが全く進展しません。 アドバイスをお願いします。

  • WordでVBAの変数について

    ThisDocumentにて宣言した変数内の数値をModule1の処理内で使用したいのですが ThisDocumentにてPublicで宣言した変数に数値を入れてModule1にてMsgboxを使用して確認した所参照できていませんでした Module1にてPublicで宣言した変数内の数値をModule2で参照することはできましたがThisDocumentだとうまくいきません Publicで宣言すれば別モジュールから参照できると認識しているのですが間違いでしょうか? プログラム等やったことがないので根本的な勘違いをしているかもしれませんがどなたかご教授ください。

専門家に質問してみよう