extern - みる会図書館


検索対象: プログラミング言語C++
72件見つかりました。

1. プログラミング言語C++

150 第 4 章関数とファイル りはるかに有用性が低いことに注意されたい . ヘッダファイルに単純な定数の定義は置くことは薦めるが , 定数の集合体の定義を置く ことは薦めないのは , 的な理由からである . ほとんどのコンバイラは , 定数集合体の 冗長なコピーが生成されないことを保証するほど気の利いたものではない . しかも , 単純 な場合の方が , はるかによく見受けられるし , それゆえ良いコードを生成するためにはよ り重要である . 4.3.1 単一ヘッダファイル プログラムをいくっかのファイルに分ける問題の簡単な解決法は , 関数とデータ定義を適 当な数のソースファイルに置き , それらが互いにやりとりするのに尼要な型を一つのヘッダ ファイルで宣言して , それを , 他のすべてのファイルで取り込むようにする方法である . 卓 上言 f 算機のプログラムでは , 四つの . c ファイル , すなわち lex ・ c, syn. c, table. c, main. c, それに , 二つ以上の . c ファイルで使われているすべての名前の宣言を含むヘッ ダファイル dc . h を使うことができるだろう : / / dc . h: 卓上計算機についての共通の宣言 #include く iostream. h> enum token value { NUMBE R ′ M 工 NUS= PLUS= ′十′ ASS 工 GN= PR 工 NT= ′・′ ä石 int no Of errors ー extern double e てて or ( const char* s ) ー extern token value get token ( extern token value curr tOk; extern double number value ー extern char name string [ 256 ]; extern double extern expr ( 房 double extern term( p て土爪 ( double extern

2. プログラミング言語C++

r. 7 宣言 676 リファレンスマニュアル / / g() は外部リンケージを持つ char* 9 ( char* g() / / 工ラー : 矛盾したリンケージを持っ static ′は内部リンケージを持つ 二つの定義 工ラー ′は内部リンケージを持っ 物′はまだ内部リンケージを持っ ′は外部リンケージを持っ / / 工ラー : 矛盾したリンケージを持っ ′ d ′は外部リンケージを持つ int extern / / 工ラー : 矛盾したリンケージを持つ static int 末定義クラスの名前を使用できる . しかしながら , このような宣言 extern 旦言では , は , その末定義クラスを定義するまで使用できない . 例えば , struct S; extern S a; extern S f ( 房 extern ▽ 0 土 d g ( S void h( ) static int a; int a; static int b; int b; extern int C ー static int C ー : s は未定義 : s は末定義 、エラー 、工 - ラー 9 ( a 房 r. 7.1.2 関数指定子 一部の指定子は , 関数宣言においてだけ使用できる .

3. プログラミング言語C++

252 第 6 章派生クラス / / ファイル screen. h . const int XMAX=40 ー const int YMAX=24 ー struct point { int x,y; point ( ) { } point(int a ′ int b) { x=a; y=b; } extern VOid put_point ( int a ′ int b) ー inline void put_point ( point p ) { put_point ( p ・ x ′ P ・ y 房 extern VOid put 1ine ( int, int ′ int ) : inline void put line (point a, point b ) { put line ( a ・ x ′ a ・ y ′ b ・ x ′ b ・ y } extern void screen extern void screen extern ▽ 0 土 d screen extern void screen #include <iostream init( destroy ( refresh( clear( ) : 出力関数を最初に使用する前に , 画面が screen init( ) によって初期設定されなけ ればならず , 画面データ構造への変更は screen refresh( ) の呼び出しの後にのみ画 面に反映される . 。。再描画 (refresh) " は , 単に前の画面の元になっていた画面酉リの新し いコピーを印字することによってなされることが読者にはわかるであろう . 画面のための 関数とデータ構造をここに示す :

4. プログラミング言語C++

4.2 / / f i le 1 . c : int a int f() { / ☆何かを行う * / } void g ( ) { a int f ( extern int a; / / f 土 1e2 . c : リンケーン 145 f 土 1e2 . c 内の 9 ( ) で使っている a と f() は , filel . c 内で定義されているものであ る . キーワード extern は , f 土 1e2 . c の a の旦言が ( 単に ) 宣言であり , 定義ではない ことを示している . a が初期設定されていたなら , extern は単純に無視されていただろ う . というのは初期設定子を伴う宣言はいつでも定義だからである . オプジェクトは , プ ログラム内でただ一度だけ定義されなければならない . 宣言は何度行ってもよいが , その 型は正確に一致していなければならない . 例えば : / / f 土 1e 1 . c : int a int b extern / / f 土 le 2 . c : int a; extern extern 1 : int C : double b; int c; この例には , 三つのエラーがある : a が二度定義されており ("int a は , "int a=0; という意味の定義になる ) , b は異なる型で二度宣言されており , c は二度宣言されてい るが定義されていない . これらのエラー ( リンケージェラー ) は , 一度に一つのファイル しか見ないコンパイラでは検出できない . しかし , そのほとんどはリンカによって発見可 能である .

5. プログラミング言語C++

r. 7 宣言 686 リファレンスマニュアル ある名前の多重定義関数 ( 13 ) の集合の中で , c リンケージを持っことができるのは , 高々ーっだけである . 7.4 を見られたい . オプジェクトに対してもリンケージを指定できる . 例えば , extern "C" { iobuf 土 Ob [ NF 工 LE int flsbuf(unsigned ′ iobuf* リンケージ指定の { } の中で , 関数やオプジェクトを static と宣言してもよい . ただ し , このような関数やオプジェクトに対しては , extern リンケージ指令は無視され , 内 部リンケージを持っ . そうでなければ , リンケージ指定で宣言された関数は , あたかも明 示的に extern と宣言されたかのようにふるまう . 例えば , extern "C" double f( static double f( これはエラーである ( 7.1.1 ) . 構造物 extern "C" { / * の中で定義されたオプジェクトは , ( 単に宣言されただけではなく ) すでに定義されている . C + + から他の言語で定義されたオプジェクトへのリンケージや , C + + で定義されたオプ ジェクトへの他の言語からのリンケージは , 実装依存かっ言語依存である . 二つの言語の 実装におけるオプジェクトレイアウトの戦略が充分に似ている場合にのみ , こういったリ ンケージは達成され得る . 〃れた ag ←平 ec 加側〃硼の立 r ⅲ g - 伽 e 川 / におけるリンケージスタイルの命名に , プログラミ ング言語の名前を使用する場合 , その綴りは , その言語を定義している資料から取って来 ることを薦める . 例えば , Ada (ADA を使わすに ) や FORTRAN (Fortran を使わずに ) というように / / 工ラー

6. プログラミング言語C++

リファレンスマニュアル 立 or ge - c づ pec er. ・ autO register static extern r ユ 1 指定子 675 auto 又は register 指定子は , プロック ( 阯 6.3 ) 中で宣言されるオフ・ジェクトの名 前と仮引数 ( 8.3 ) だけに適用できる . auto 宣言子は , ほとんどの場合 , 冗長であるた め , 使われないことが多い . auto の使用法の一つに , clara 0 れ - 立砒夜厩 ( 宣言文 ) と e 挈尾 s 豆。れ - 豆砒夜な ( 式文 ) を明示的に区別することがある . register 宣言は , auto 宣言であると同時に , 宣言する変数の使用頻度が高いこと のコンパイラに対するヒントである . このヒントは , 無視されるかもしれない . ほとんど の実装においては , その変数のアドレスが使用された場合 , これは無視される . オプジェクト宣言は , extern 指定子を含み初期設定子を持っていないものを除けば , 定義である ( 3.1 ) . 定義は , 適当な量の記憶領域を確保し , 任意の適当な初期設定を行う . static 指定子と extern 指定子は , オプジェクト名 , 関数名 , そして名前なし共用体だ けに適用できる . プロック中には , static 関数宣言は存在できず , static や extern の仮引数も存在できない . 静的クラスメンバについては 9.4 で述べられる . extern は , クラスメンバについては使用できない static と指定された名前は , 内部リンケージを持つ . const と宣言されたオプジェ クトは , 以前に外部リンケージが与えられていなければ内部リンケージを持つ . extern と指定された名前は , 以前に内部リンケージが与えられていなければ外部リンケージを持 つ . storage-class-specifier ( 記憶クラス指定子 ) を持たないファイルスコープの名前は , const と宣言されていなければ , 以前に内部リンケージが与えられていない限り外部リ ンケージを持つ . 非メンバ関数に対する inline 指定子は , リンケージという目的に関 / / f ( ) はまだ内部リンケージを持つ f() は内部リンケージを持っ しては static 指定子と同値である ( 3.3 ) . 名前についてのすべてのリンケージ指定 char* f( ) static char* f( / / は一致しなければならない . 例えば ,

7. プログラミング言語C++

158 第 4 章関数とファイル ープに " c " を加 たくさんの exte て n 旦旨に " c " を加えることは厄介なので , えるメカニズムがある . 例えば : extern "C" { 旦言のグル char* strcpy(char* ′ const char* ) ー int strcmp(const char* ′ const char* ) ー #include <string. h> extern "C" { 用いられる . 例えば : この構造は , 完全な C のヘッダファイルを囲み , C + + で使うのに適したヘッダにするのに int strlen(const char* ) ー 法としては , 条件付きコンバイルを使って C と C + + に共通のヘッダを作成することもで この技法は , c の標準ヘッダから c + + の標準ヘッダを生成するのによく使われる . 別の方 きる : #ifdef extern #endif CPIUSPIUS char* strcpy(char*, const char*); int strcmp(const char* ′ const char*) ー int strlen(const char*) ー #ifdef #endif cplusplus あらかじめ定義されているマクロ名 cplusplus は , このファイルが C のヘッダとし て使われるときに , C + + の構造物カ陬り除かれることを保証するのに使われる . extern " c " 指令が影響を与えるのはリンケージの慣習だけなので , リンケージプロッ ク中にはどのような宣言も現れることができる :

8. プログラミング言語C++

宣 59 int count ー int count; ェラー : 再定義 extern int error number; 型の不適合 extern short e て ro て number; / / 工ラー また次のコードにはエラーはない ( exte て n の用法については .2 を見られたい ) : extern e てて number ー extern ー 定義には , 定義する実体の " 値 " を指定できるものもある : struct complex { float て e ′土Ⅲー } ー typedef complex point ー float real ( complex* p ) { return p—>re } ー const double pi 3 . 1415 9 2 6 5 3 5 8 9 7 9 3 2 3 85 : 型、 , 関数 , 定数については。。値 " は不変である . 定数でないデータ型については初期値は ' で変更してもよい 土れ t count char* name count n ame 前の定義のうち char ch; complex cvar ー だけは値を指定していない . 値を指定する宣言はどれも定義である . 2.1.1 スコープ 宣言はあるスコープに名前を導入する . すなわち , 名前はプログラムテキストの特定の 部分でのみ用いることができる . 関数の中で宣言される名前 ( しばしば局所名と呼ばれる ) については , スコープは宣言の箇所からその宣言が起こったプロックの終わりまでである . 関数やクラスの中で宣言されたのではない名前 ( しばしは、大域名と呼ばれる ) については , BJarne ー Marian

9. プログラミング言語C++

4.3 ヘッダファイル 155 / / table . c : 記号表の定義 #include "error . h" #include <string. h> #include "table . h" const int TBLSZ name* table [ TBLSZ name* look(const char* p ′ int ins) { / * こで , 文字列を扱う関数の宣言は , く str 土 ng. h > から取り込んでいることに注意され たい . これにより , さらにもうーっ潜在的なエラーの源が除去される . / / lex. h : 入力と字句解析の宣言 enum token value { NAME ′ NUMBE R ′ P も US = ′十′ MINUS= ASSIGN= PR 工 NT= D 工▽ = ′ / ′ token value curr tok; extern double number value; extern char name string[256] : extern token value get token ( extern この字句解析器のインタフェースはとても汚い . 適切なトークンの型を持たないので , get tOken ( ) のユーザに実際の字句バッファ number value と name string を 見せる必要がある . 入力と字句解析の定義 / / lex . c : #include く土 OSt て eam.. h> #include <ctype. h> #include #include " 1ex . h "

10. プログラミング言語C++

4.5 ライプラリの作り方 extern ” C ” { , こにどのような宣言が現れてもよい / / 例えば : static int st; int glob; 特に , 変数のスコープと記億クラスに影響はないので , st はそのまま内部リンケージを 持ち , glob は大域変数である . 159 C + + の型チェックや引数変換規則に従う . より弱い C の規則ではない . 例えば : クスには影響を与えないことに注意されたい . 特に extern "c" と宣言された関数は , extern " c " 指令はリンケージの慣習 ( のみ ) を指定し , 関数呼び出しのセマンティ extern " C ” int f ( ) ー int g ( ) return f ( 1 ) : / / 工ラー 引数は予期されていない 4.5 ライプラリの作り方 は次のようなものになる : 集合に , 数学関数の集合を提供しなければならない場合を考えてみよう . ヘッダファイル ファイルが一つ以上あるのが普通である . 例えば , ( 便利な方法で ) ある不特定のユーザの 得られる . 。ファイルの集合である . それらの .0 ファイルを使うのに必要な旦言を含む . h ライプラリは基本的には , 対応する . c ファイルの集合をコンパイルすることによって い方について述べることにする . 他のシステムでも同様の機能が提供されている . 依存している . しかしこの節では , UNIX システム第 10 版でのライプラリの作り方と使 もっているのであろうか . 残念ながら , その答は使っているオペレーティングシステムに 書中や他の場所で ) よく使われるが , c + + のプログラムについてこれはどのような意味を 。ライプラリに置く " とか , 。なんらかのライプラリから見つかる " といった言葉が ( 本