ヘッダーでのグローバル定数と関数の宣言

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

ヘッダーでのグローバル定数と関数の宣言

#1

投稿記事 by YYSS » 8年前

~開発環境~
 Windows 7 Ultimate SP1 32bit
 Visual C++ 2010
 DXライブラリ

分割されたファイルを見直しているのですが、
インクルードガードについて2つほど疑問点に思うことがあったので質問をさせて下さい。


1.グローバル定数の宣言

すべてのソースファイルからインクルードされる、グローバルなヘッダーファイルを
作っていたのですが、
下記のように、ヘッダーファイル内でconst定数を宣言したところ

コード:

//const.h

#ifndef CONST_INCLUDE
#define CONST_INCLUDE

//ウィンドウサイズ
const	int		MAX_X			= 800;			//ウィンドウサイズ最大横
const	int		MAX_Y			= 600;			//ウィンドウサイス最大縦
const	int		MIN_X			= 0;			//ウィンドウサイス最小縦
const	int		MIN_Y			= 0;			//ウィンドウサイス最小縦
const	int		CEN_X			= MAX_X / 2;	//ウィンドウ中心横
const	int		CEN_Y			= MAX_Y / 2;	//ウィンドウ中心縦

#endif
多重定義になるかと思いましたが、問題無くコンパイルが通りました。

ヘッダー内で宣言をするのは良くないと言う噂も耳にしたので、
下記のようなパターンも作ったのですが、こちらもコンパイルは通りました。

コード:

//const.h

#ifndef CONST_INCLUDE
#define CONST_INCLUDE

//ウィンドウサイズ
extern	const	int		MAX_X;			//ウィンドウサイズ最大横
extern	const	int		MAX_Y;			//ウィンドウサイス最大縦
extern	const	int		MIN_X;			//ウィンドウサイス最小縦
extern	const	int		MIN_Y;			//ウィンドウサイス最小縦
extern	const	int		CEN_X;			//ウィンドウ中心横
extern	const	int		CEN_Y;			//ウィンドウ中心縦

#endif

コード:

//const.cpp

//ウィンドウサイズ
const	int		MAX_X			= 800;			//ウィンドウサイズ最大横
const	int		MAX_Y			= 600;			//ウィンドウサイス最大縦
const	int		MIN_X			= 0;			//ウィンドウサイス最小縦
const	int		MIN_Y			= 0;			//ウィンドウサイス最小縦
const	int		CEN_X			= MAX_X / 2;	//ウィンドウ中心横
const	int		CEN_Y			= MAX_Y / 2;	//ウィンドウ中心縦

最初の例だと、全てのソースファイルに、各定数が埋め込まれそうな気がしたのですが・・・
でも、それだと多重定義になるような・・・
手間を考えると最初の例の方が楽なのですが・・・

どちらも、結果は同じなのでしょうか?
あと、どちらの書き方の方が良いのでしょうか?(人それぞれかもしれませんが…)



2.グローバル関数の宣言

さっきと同じ、すべてのソースファイルからインクルードされる、
グローバルなヘッダーファイルの件ですが、
関数宣言の際にヘッダーに

コード:

//const.h
#ifndef CONST_INCLUDE
#define CONST_INCLUDE

	double	sin2( double ang );
	
#endif

コード:

//const.cpp
#include	"const.h"

double	sin2( double ang ){		return( sin( DegRad( ang ) ) );	}
普通に宣言する場合と

コード:

#ifndef CONST_INCLUDE
#define CONST_INCLUDE

	extern	double	sin2( double ang );

#endif
extern宣言の場合。

externを付けても付けなくても問題なくコンパイルが通り、問題なく動作しているのですが、
プロトタイプ宣言も、外部宣言も同じでしょうか?



処理は問題ないのですが、どちらの方が効率が良いのかな・・・
と、変に考え込んでしまったので意見を下さると幸いです。

たかぎ
記事: 328
登録日時: 9年前
住所: 大阪
連絡を取る:

Re: ヘッダーでのグローバル定数と関数の宣言

#2

投稿記事 by たかぎ » 8年前

まず、1.についてですが...
const修飾子が付いた非局所オブジェクトは、デフォルトでは内部結合になります。↓参照
http://www.kijineko.co.jp/tech/supersti ... nkage.html
つまり、ヘッダファイルで定義したオブジェクトは、翻訳単位ごとに別々の実体を表すことになります。
今回のようなconst修飾子された汎整数型のオブジェクトの場合、まともなコンパイラであれば、実際に使わなければメモリを消費することはまずありません。
また、汎整数定数式として使うこともできるわけですが、外部結合の場合はそうはいきませんので、externを付けて定義を一か所にまとめた方が効率は悪くなる傾向にあります。

次に2.についてですが...
関数の場合はデフォルトで外部結合になりますので、externを付けても付けなくても同じ意味になります。

アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

Re: ヘッダーでのグローバル定数と関数の宣言

#3

投稿記事 by YYSS » 8年前

返答ありがとうございます。

うやむやだった部分が明確になって、なんかスッキリしました。
外部結合と内部結合という言葉自体知らなかったので、参考になりました。

閉鎖

“C言語何でも質問掲示板” へ戻る