• 締切済み

変数宣言・変数定義のちがいって??

変数宣言・変数定義のちがいって?? 同じ意味なんでしょうか? 私の解釈では、 ・宣言っていうのは、今からこの変数を使いますよってことで。 ・定義っていうのは、実際に変数の領域をわりあてるってイメージなんですけど・・ なので、 int a; ←これは変数定義 extern int a; ←これは変数(extern)宣言 あってるでしょうか?

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

JIS X3010:2003では、6.7 宣言において、 意味規則 宣言は, 幾つかの識別子の解釈及び属性を指定する。識別子の定義(definition)とは, 宣言のうち次のものをいう。 - オブジェクトに対しては, そのオブジェクトの記憶域を確保する宣言 - 関数に対しては, 関数本体を含む宣言 - 列挙定数又は型定義名に対しては, その識別子の(唯一の)宣言 と規定されています。 > int a; ←これは変数定義 > extern int a; ←これは変数(extern)宣言 後者はあっています。 前者は文脈によって解釈が変わります。 ファイル有効範囲に前者の記述が現れた場合、それは「仮定義」になります。同じファイル有効範囲に、初期化子または記憶クラス指定子を伴う宣言が現れると、そちらが本当な定義になります。

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.3

a function declaration with no function body. declare されたものはどこかで詳細に define されて居なければならない。 というかんじだから良いとおもいますよ。

  • asuncion
  • ベストアンサー率33% (2126/6287)
回答No.2

>・宣言っていうのは、今からこの変数を使いますよってことで。 >・定義っていうのは、実際に変数の領域をわりあてるってイメージなんですけど・ そのとおりです。 変数の定義は、当該変数の領域を確保する、という意味です。 変数の宣言は、どこか別の場所で定義した変数をそこで使う、という意味です。 したがいまして、宣言の中に定義を含むという#1さんの見解は逆です。 定義の中に宣言を含みます。

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

c言語には、変数の型を定義する方法として、typedef と言うのが用意されていますよ。 c言語では、 ・変数の宣言 と言うと、例えば今から a と言う変数を使いますよ。 と指示します。 ・変数の定義 と言うと、変数がどんなものであるのかと言う事を指示する ものだと思われます。 ですから、変数の宣言は、変数の型も指定していると思われますから、 変数の定義も含まれていると思われます。

関連するQ&A

  • 外部変数について

    今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++でのポインタ宣言とメソッド定義について教えていただきたいのですが int a; int* b=&a; int *b=&a 型の後ろに*をつける場合と、変数名の前につける場合って 同じ意味合いと解釈してもよろしいのでしょうか? また、以下のコンストラクタ実行時に:x(0)という記述はx=0と同じ処理をしているのでしょうか? よろしくお願いいたします。 class test{ public: int x; test(); } test::test():x(0) { } int main() { test obj; return 0; }

  • [C++]クラスの宣言と定義の違いって?

    クラスの宣言と定義の違いってなになのでしょうか? 宣言(定義)とは具体的にどのような記載をいうのでしょうか? いろいろ調べてこうかなっというのを記載します。 私の中では、宣言はメモリの割り当てがなされていない、宣言はメモリの割り当てがなされるという認識です。 class CSubCalss : public CSuperClass { public: } ↑これが宣言 int main () { CSubCalss a; ←これが定義 return 0; }

  • c# 配列変数の宣言について

    c#の配列変数の宣言についてですが、 以下の2つの宣言は同じことなのでしょうか。 (1)int[] num = {1,2,3}; (2)int[] num = new int{1,2,3}; 本では(2)のような定義していますが何かルールのようなものがあるのでしょうか。 宜しくお願いします。

  • 「変数の宣言」と「変数の定義」は同じ意味ですか?

    Dim myStr As String は、変数の宣言と定義、どちらになるのでしょうか? どちらともいいますか?

  • ”int *a,*b”というポインタ変数宣言した値でa=&bということ

    ”int *a,*b”というポインタ変数宣言した値でa=&bということはできる? ”int *a,*b”このような変数をグローバル宣言した場合、 a=&bというようなことはできるのでしょうか? ”int *a,*b” この宣言で、 aが10番地 bが20番地に定義されたと仮定しています。

  • 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の宣言をする。

  • MicroC コンパイラ 変数宣言

    MicroC コンパイラ 変数宣言について質問です BYTE tmp1; WORD tmp2; なる定義があったとして 変数型範囲はどの範囲になるのでしょう 下記の定義は見つかったのですが 上記は分かりません 変数型 バイト数 範囲 (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 (signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295 float 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 long double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038

  • 変数の宣言方法の相違によるエラー

    ある変数を関数内で宣言した場合、デバック時に「ハンドルされていない例外が発生しました」っていうエラーになります。でも、グローバル変数として宣言した場合には、同じエラーが発生しませんでした。今回の場合、配列を10,000,000ぐらい確保しようとしたので、メモリ領域を確保できなかったが、エラーの発生原因だと思います。メンバ変数とグローバル変数で確保できるメモリ領域にどれくらいの違いがありますか。その他にクラスのメンバ変数として宣言した場合とグローバル変数として宣言した場合でどのような違いがありますか。 わかる方が教えてください。よろしくお願いします。

  • 自作関数のでの変数宣言について

    #include <stdio.h> int i,j; int cale(int i,int j) //cale関数の内容;iとjの宣言も同時実施!!! { int r;      r=i+j; return r; } 3行目でcale関数の定義をしています。2行目では変数i,jの初期宣言をしていますが、本によると2行目は必要なくコンパイルしても問題がありませんでした。ボーランドですけど。 教えて欲しいのは2行目の変数宣言は必要なのですか?? 正規の書き方を教えてください。

専門家に質問してみよう