ここから本文です

C言語基礎プロトタイプ宣言にextern?

changerさん

2020/4/916:44:02

C言語基礎プロトタイプ宣言にextern?

https://elixir.bootlin.com/linux/v2.6.17.8/source/arch/x86_64/kerne...

Linux一般保護例外(13)をIDTに登録しているのを見つけたのでたどってみると

その登録された割り込みルーチンのプロトタイプ宣言を見つけました。

https://elixir.bootlin.com/linux/v2.6.17.8/source/arch/i386/kernel/...

それがこれです。

asmlinkage void general_protection(void);

①asmlinkage・・・

https://elixir.bootlin.com/linux/v2.6.17.8/source/include/asm-i386/...

#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))

②regparm属性について

https://www.xlsoft.com/jp/products/intel/compilers/manual/cpp_all_o...

引数は0だから・・・結局意味ない?

③CPP_ASMLINKAGE

#define CPP_ASMLINKAGE extern "C"

https://elixir.bootlin.com/linux/v2.6.17.8/source/include/linux/lin...

これらを並べると・・・

asmlinkage void general_protection(void);

CPP_ASMLINKAGE __attribute__((regparm(0))) void general_protection(void);

extern "C" __attribute__((regparm(0))) void general_protection(void);


下記のところまでは理解できましたが
__attribute__((regparm(0))) void general_protection(void);

このextern "C" は何なんですか?

externはグローバル変数を外部ファイルから参照するという宣言(?)みたいなものみたいですが・・・


分からないので教えてください。

閲覧数:
35
回答数:
2

違反報告

ベストアンサーに選ばれた回答

Hermitさん

2020/4/920:38:30

extern "C"
は、C++用の宣言です。
C言語用のライブラリ関数であることを示します。
C++では、関数は引数などの情報を、
アセンブラレベルでのラベル名に反映させるので、
C++ソース上では同じ関数名でも、アセンブラレベルでは
違う関数を呼ぶようになります。

Cでは、そんなことはなく、追加してもアセンブラレベルの名前は、
関数名の前か後ろに _ が付くくらいなので、
引数を変えても、きちんとその関数呼んでくれます。
(動作はともかくとして)

C++で作っても、extern "C" が付く関数は、
Cと同様に、アセンブラレベルでの関数名を変えません。

Cでは、C言語でその書式はエラーになりますので、
C言語と共用するようなヘッダの場合は
通常は、C++ソースであることを確認して、
(多分、C++コンパイラが、__cplusplus などを #define する)
Cコンパイラでは、"C" を付けないようにしていると思います。

  • Hermitさん

    2020/4/920:50:31

    g++でコンパイルしてみました。
    -------extern "C" が有る場合のシンボルネーム
    d:\usr\home>type foo.s
    .file "foo.cc"
    .text
    .p2align 4
    .globl _general_protection
    .def _general_protection; .scl 2; .type 32; .endef
    _general_protection:
    ret
    .ident "GCC: (tdm-1) 9.2.0"

    -------extern "C" が無い場合のシンボルネーム
    d:\usr\home>type bar.s
    .file "bar.cc"
    .text
    .p2align 4
    .globl __Z18general_protectionv
    .def __Z18general_protectionv; .scl 2; .type 32; .endef
    __Z18general_protectionv:
    ret
    .ident "GCC: (tdm-1) 9.2.0"

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2020/4/12 02:27:54

ありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

yuk********さん

2020/4/1008:36:12

何か?って?

お前さんが「Cで書いた部分とアセンブリで書いた部分をリンクできなかった理由」だよ。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる