teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

refinement

2017/09/08 04:49

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  > グローバル変数に値を代入する際に、他のグローバル変数を用いると次のようなコンパイルエラーが生じます。
2
2
 
3
- プログラミングC言語の制限(仕様)です。Chironianさん回答にあるように、C言語では「グローバル変数(定数)の初期化には定数しか利用できません」。またC言語では「const付きで定義された変数は"定数"ではありません」。後者はC++言語ならば"定数"として扱われます。
3
+ プログラミングC言語の制限(仕様)です。Chironianさん回答にあるように、C言語では「グローバル変数(const付きも含む)の初期化には"定数"しか利用できません」。またC言語では「const付きで定義された変数は"定数"ではありません」。後者はC++言語ならば"定数"として扱われます。
4
4
 
5
5
  ```c
6
6
  // (ファイルスコープ)
@@ -19,7 +19,7 @@
19
19
  下記の選択肢があります:
20
20
 
21
21
  - 1) マクロ定義(`#define t1 1.0`, `#define t2 (2.0*t2)`)に変更する。ただし、マクロ定義名は大文字(`T1`や`T2`)としておくのが一般的です。また短すぎるマクロ名も別のトラブルの元になりますから、その定数の意味を表す明快な名前に変更すべきです。
22
- - 2) "`enum`ハック"とよばれる回避策を利用する。ただし、今回のように浮動小数点数には適用できません。例: `enum { SIZE = 10 }; int [SIZE];`のように書けます。
22
+ - 2) "`enum`ハック"とよばれる回避策を利用する。ただし、今回のように浮動小数点数には適用できません。例: `enum{SIZE = 10}; int arr[SIZE];`のように書けます。
23
23
  - 3) C言語ソースコードを、C++言語としてコンパイルする。いわゆる"Better C"としてのC++の利用です。
24
24
 
25
25
  いずれの方式もあまりオススメできるものではありませんが、情報の提供として。

1

refinement

2017/09/08 04:49

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -1,16 +1,15 @@
1
1
  > グローバル変数に値を代入する際に、他のグローバル変数を用いると次のようなコンパイルエラーが生じます。
2
2
 
3
- プログラミングC言語の制限(仕様)です。Chironianさん回答にあるように、C言語では「グローバル変数定数の初期化には定数値しか利用できません」。またC言語では「const付きで定義された変数は"定数"ではありません」。後者はC++言語ならば定数として扱われます。
3
+ プログラミングC言語の制限(仕様)です。Chironianさん回答にあるように、C言語では「グローバル変数(定数)の初期化には定数値しか利用できません」。またC言語では「const付きで定義された変数は"定数"ではありません」。後者はC++言語ならば"定数"として扱われます。
4
4
 
5
5
  ```c
6
6
  // (ファイルスコープ)
7
- int gv1 = 10; /* OK */
7
+ int gv1 = 10; // OK: 値10は定数
8
- const int gc1 = 20; /* OK */
8
+ const int gc1 = 20; // OK: 値20は定数
9
9
 
10
+ int gv2 = gv1 * 2; // NG: gv1は定数でない
11
+ const int gc2 = gc1 * 2; // NG: gc1は定数でない
10
12
 
11
- int gv2 = gv1 * 2; /* NG */
12
- const int gc2 = gc1 * 2; /* NG */
13
-
14
13
  int main()
15
14
  { ...
16
15
  ```
@@ -19,8 +18,8 @@
19
18
 
20
19
  下記の選択肢があります:
21
20
 
22
- - 1) マクロ定義(`#define t1 1.0`, `#define t2 (2.0*t2)`)に変更する。ただし、マクロ定義名は大文字(`T1`や`T2`)としておくのが一般的です。
21
+ - 1) マクロ定義(`#define t1 1.0`, `#define t2 (2.0*t2)`)に変更する。ただし、マクロ定義名は大文字(`T1`や`T2`)としておくのが一般的です。また短すぎるマクロ名も別のトラブルの元になりますから、その定数の意味を表す明快な名前に変更すべきです。
23
- - 2) "`enum`ハック"とよばれる回避策を利用する。ただし、今回のように浮動小数点の場合は適用できません。例: `enum { SIZE = 10 }; int [SIZE];`のように書けます。
22
+ - 2) "`enum`ハック"とよばれる回避策を利用する。ただし、今回のように浮動小数点数には適用できません。例: `enum { SIZE = 10 }; int [SIZE];`のように書けます。
24
23
  - 3) C言語ソースコードを、C++言語としてコンパイルする。いわゆる"Better C"としてのC++の利用です。
25
24
 
26
25
  いずれの方式もあまりオススメできるものではありませんが、情報の提供として。