C言語についてはある程度理解しているつもりだったのですが、ファイル分割で躓いています。
とあるヘッダでextern宣言を行い、全てのcファイルでそのヘッダをインクルードしています。
その場合、どのcファイルでもいいのでextern宣言を行った変数を定義をすれば、変数の共有は可能という認識だったのですが、
エラーで弾かれてしまいます。(よくある外部参照が未解決というエラーです)
この認識が間違っていれば、ご指摘願えますでしょうか。
補足までに、使用している環境はVisual Studio 2008です。
extern宣言と定義について
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: extern宣言と定義について
どこかのcppで実体の定義は行われているのでしょうか?
※ externのない変数宣言です。
※ externのない変数宣言です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: extern宣言と定義について
他のcファイルでexternした変数に値を入れています。
これでは実体化されないのでしょうか?
これでは実体化されないのでしょうか?
Done is better than perfect.(Mark Elliot Zuckerberg)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: extern宣言と定義について
extern は実体を作らず外部にある実体を参照する変数であると言う意味になります。atori さんが書きました:他のcファイルでexternした変数に値を入れています。
これでは実体化されないのでしょうか?
なので、どこかのc/cppファイルに実体は必要です。
>externした変数に値を入れています。
代入と宣言は全く関係ありません。
もしローカル変の定義と初期化のことを言っているならグローバル変数には無関係です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 14年前
- 住所: 東京
Re: extern宣言と定義について
"extern"をつけずに普通に宣言した変数が実体になります。
main関数があるcファイルで実体を宣言することをおすすめします。
h1.h main.c あと、"extern"をつけた場合代入しちゃダメですよ。
たしかコンパイルエラーにはならなかったと思いますが代入は行われません。
最後に、こう言ってはナンですが、グローバル変数というものは、そうそう使うものではありませんよ。
main関数で宣言して、引数を使ってやり取りするか、関数内static変数を使うべきです。
特に、関数内static変数が使える状況ならば積極的に使っていくべきだと思います。
もっとも、Cはクラスが使えないわけですから、グローバル変数を使った方がすっきりする場合もありますから、一概にどうとは言えませんが。
main関数があるcファイルで実体を宣言することをおすすめします。
h1.h main.c あと、"extern"をつけた場合代入しちゃダメですよ。
たしかコンパイルエラーにはならなかったと思いますが代入は行われません。
最後に、こう言ってはナンですが、グローバル変数というものは、そうそう使うものではありませんよ。
main関数で宣言して、引数を使ってやり取りするか、関数内static変数を使うべきです。
特に、関数内static変数が使える状況ならば積極的に使っていくべきだと思います。
もっとも、Cはクラスが使えないわけですから、グローバル変数を使った方がすっきりする場合もありますから、一概にどうとは言えませんが。
Re: extern宣言と定義について
MoNoQLoREATORさんのソースを元に改変してみました。MoNoQLoREATOR さんが書きました:"extern"をつけずに普通に宣言した変数が実体になります。
main関数があるcファイルで実体を宣言することをおすすめします。
私のソースの場合次のような処理をしています。
h1.h main.c このvar[]変数を別のファイル(h1.hはインクルード済み)で使用しようとした場合に"外部参照が未解決"とエラーが出ました。
softya(ソフト屋)さんが言っていたように実体の宣言を入れてみても変わりないです。
問題点を指摘していただけないでしょうか。
Done is better than perfect.(Mark Elliot Zuckerberg)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: extern宣言と定義について
main.cに関してはこうすればOKです。
元の問題。
int var[];だけだと大きさ不明なので定義できません。
var[] = {{0},{1},{2}};初期値代入は実体の定義時にしかできません。スカラ変数に対して{0}は文法的にNGです。
int var[];だけだと大きさ不明なので定義できません。
var[] = {{0},{1},{2}};初期値代入は実体の定義時にしかできません。スカラ変数に対して{0}は文法的にNGです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: extern宣言と定義について
エラーが消え無事実行することができました。
MoNoQLoREATORさん
softya(ソフト屋)さん
ありがとうございました。
MoNoQLoREATORさん
softya(ソフト屋)さん
ありがとうございました。
Done is better than perfect.(Mark Elliot Zuckerberg)