タイトルの通り、defineで定義した値を配列のサイズ指定に使いたいと考えています。
この場合、次のような使い方をしても問題ないのでしょうか?
/* サンプルここから */
#define SIZE_A 10
#define SIZE_B 20
#define SIZE_ALL (SIZE_A * SIZE_B)
cahr ARR[SIZE_ALL];
/* サンプルここまで */
コンパイル時にワーニング等はありませんが、int型という型を宣言していないSIZE_ALLを要素数として使用するのが不安に感じるのですが問題ないのでしょうか?
int SIZE_int = SIZE_ALL;
とdefineした値を明示的にint型変数に代入した上で、
cahr ARR[SIZE_int];
とすべきなのでしょうか?
初歩的な質問ですが、ご教示お願いします。
No.3ベストアンサー
- 回答日時:
★特に問題ありません。
・普通に define された定数を掛け算などして新しい記号定数を定義します。
そしてその記号定数を配列などの添え字に使います。
そもそも define された定数は通常は int 型と同じになります。
#define SIZE_A 10…int型
#define SIZE_A 10L…long型
#define SIZE_A 10LL…long long型
となります。
『L』や『LL』のサフィックスを付けないとすべて int 型に解釈されます。
つまり、プリプロセッサ命令は単純な文字列の置換ですのでサフィックスを
付けないと int 型になるわけですよ。
・もし char 型にしたいならキャストを指定します。
例えば
#define SIZE_A ((char)(10))
とします。
・もう既に回答がありますが
>int SIZE_int = SIZE_ALL;
>とdefineした値を明示的にint型変数に代入した上で、
>cahr ARR[SIZE_int];
>とすべきなのでしょうか?
↑
この方法は新しい記述方法です。
1999年の最新のC言語の規格です。
この C99 にすべてのコンパイラが対応しているわけではないため使わない方が
良いかもしれません。この記述が利用できれば便利なこともありますが…。
・最後にカッコをつけた方が良いですよ。
#define SIZE_A (10)
#define SIZE_B (20)
#define SIZE_ALL (SIZE_A * SIZE_B)
という風に SIZE_A、SIZE_B に括弧を付けます。
これは今後 SIZE_A を『10 + 20』と定義した際に括弧がないと計算式が
正しくなくなるので付けるように習慣を付けておいた方が良いということです。
つまり今後
#define SIZE_A 10 + 20
#define SIZE_B 20 * 3
#define SIZE_ALL (SIZE_A * SIZE_B)
と定義したとします。
すると SIZE_ALL は (10 + 20 * 20 * 3) と置換されますが計算式が掛け算を先に
する数学上のルールより意図しない結果になります。正しくは SIZE_ALL=1800 に
なるべくところが SIZE_ALL=1210 となってしまいます。
・これを防ぐには2つ。
#define SIZE_A (10 + 20)
#define SIZE_B (20 * 3)
#define SIZE_ALL (SIZE_A * SIZE_B)
もしくは
#define SIZE_A 10 + 20
#define SIZE_B 20 * 3
#define SIZE_ALL ((SIZE_A) * (SIZE_B))
と定義します。
どちらにカッコを付けても同じですが私はすべてにカッコを付ける派です。
・参考にして下さい。
懇切丁寧な説明、ありがとうございます。
参照している書籍がビギナー向けのものばかりのためか、defineに
関する記述が少なく困っているところでした。
大変参考になりました。
No.2
- 回答日時:
#define で定義された文字列は「コンパイルされる前に」プリプロセッサによって単純に置き換えられます。
なので、char ARR[SIZE_ALL]; なる宣言はコンパイラからは char ARR[10*20]; に見えます。
gcc -E などで実際に確認してみましょう。
>int SIZE_int = SIZE_ALL;
>とdefineした値を明示的にint型変数に代入した上で、
>char ARR[SIZE_int];
>とすべきなのでしょうか?
逆に、上記の宣言はコンパイル時に SIZE_int がいくつかコンパイラにはわからないので、
C99 に準拠したコンパイラじゃないと通らないと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと タイムマシンを破壊すべきか。
これはディベートの論題だと仮定したうえでの回答お願いします。あなたは、その末にタイムマシンを壊してしまうのか、使い道を探すのかどうかを考えてもらいたいです。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
define で 配列
C言語・C++・C#
-
#defineの定数を文字列として読み込む
C言語・C++・C#
-
defineを使った配列
C言語・C++・C#
-
-
4
配列の要素数に変数を入れたいときには
C言語・C++・C#
-
5
C言語 配列の長さの上限
C言語・C++・C#
-
6
if と配列の組み合わせ
C言語・C++・C#
-
7
関数から配列を返すには?
C言語・C++・C#
-
8
C言語での引数の省略方法
C言語・C++・C#
-
9
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
10
C言語初心者の質問失礼します。
C言語・C++・C#
-
11
xcopyで特定のファイルのみをコピーする方法
Windows 10
-
12
C++で入力した文字列から数字を取り除くもしくは数字のみをのこす
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
visualstudio C# テキストボッ...
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
extern
-
相互参照するクラス、俺こんな...
-
DDVによるメッセージの変更
-
変数の型を定義しなかった場合...
-
識別子が定義されていませんと...
-
WM_NOTIFYのメッセージクラッカー
-
C++のコンストラクタを宣言する...
-
VB 関数
-
引数の受け渡し
-
0除算を判定したい
-
namespace定義の使い方
-
C言語のコンパイルエラー
-
構造体の宣言でエラーが出ます。
-
C++デバックエラーについて詳し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
typedef enumの使い方を教えて...
-
main.c:7:43: warning: implici...
-
C++でboolにintの値を代入する...
-
構造体の要素すべてに対する四...
-
intとINTの違いは?
-
ハンドルされていない例外が発...
-
DDVによるメッセージの変更
-
変数の型を定義しなかった場合...
-
【#define】 defineで定義した...
-
C++ クラスをメンバにもつクラ...
-
構造体の宣言でエラーが出ます。
-
プログラムの中で別のmainを呼...
-
void func( void )について
-
エラー「invalid conversion fr...
-
関数の実体定義にヘッダファイ...
おすすめ情報