タイトルの通り、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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- 英語 量を"size"で表現することの可否等について 1 2022/12/07 14:49
- PHP アンドロイドスマホでのphp echoの文字サイズ 1 2023/05/13 15:15
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
define で 配列
C言語・C++・C#
-
C言語での引数の省略方法
C言語・C++・C#
-
#defineの定数を文字列として読み込む
C言語・C++・C#
-
-
4
C言語 配列の長さの上限
C言語・C++・C#
-
5
defineを使った配列
C言語・C++・C#
-
6
C言語のポインタに直接アドレスを割り振りしたい
C言語・C++・C#
-
7
配列の要素数に変数を入れたいときには
C言語・C++・C#
-
8
エラーの意味は? Lvalue required
C言語・C++・C#
-
9
構造体のメンバをfor文で回したい
C言語・C++・C#
-
10
メモリをアドレスを直接指定して値を取得するには
C言語・C++・C#
-
11
配列をnビットシフトする
C言語・C++・C#
-
12
return 1L
C言語・C++・C#
-
13
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
14
式は定数値が必要です」というエラー
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラー「invalid conversion fr...
-
DWORDの実際の型は何でしょうか
-
相互参照するクラス、俺こんな...
-
構造体の要素すべてに対する四...
-
【#define】 defineで定義した...
-
long型の定数の末尾にLを付ける...
-
構造体を引数とする、クラス間...
-
C言語のreturnの使い方
-
構造体の宣言でエラーが出ます。
-
typedef enumの使い方を教えて...
-
0除算を判定したい
-
不正な構造体の演算
-
C言語でのフィボナッチ数列の表示
-
変数の型を定義しなかった場合...
-
2÷3などの余りについて
-
Enterキーを押されたら次の処理...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語を実行すると-infが出てき...
-
std::set<int> で、ある値が何...
-
Aの値からBの値を除するとは??
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
関数の実体定義にヘッダファイ...
-
main.c:7:43: warning: implici...
-
変数の型を定義しなかった場合...
-
visualstudio C# テキストボッ...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
enumについて
-
構造体の宣言でエラーが出ます。
-
【#define】 defineで定義した...
-
C++ クラスをメンバにもつクラ...
-
0除算を判定したい
-
構造体の要素すべてに対する四...
-
値を返り値に返すのと参照渡し...
-
namespace定義の使い方
-
GCCで暗黙の型変換の警告を出し...
おすすめ情報