回答編集履歴

11

VisualC++の場合について追記

2020/05/09 10:10

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -88,6 +88,8 @@
88
88
 
89
89
  (追記)C言語も[C11以降なら`_Static_assert`](https://ja.cppreference.com/w/c/language/_Static_assert)が使用でき、[`assert.h`をincludeすれば`#define static_assert _Static_assert`とdefineされる](https://ja.cppreference.com/w/c/error/static_assert)ようです。手元のMinGW gcc9.2.0では`assert.h`にそのような記述は含まれておらずdefineされませんでしたが、`_Static_assert`は使用できました。
90
90
 
91
+ VisualC++のC言語はC90(C89)なので`_Static_assert`は使用できませんが、`static_assert`は使えるようです。
92
+
91
93
  ```C++
92
94
 
93
95
  typedef enum {

10

文言修正

2020/05/09 10:10

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  (質問追記分)
26
26
 
27
- thkanaさんも書かれていますが、実行時エラーとする[`aseert`](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/assert.3.html)ではだめですか?
27
+ コメントでthkanaさんも書かれていますが、実行時エラーとする[`aseert`](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/assert.3.html)ではだめですか?
28
28
 
29
29
  注意:`aseert`は`NDEBUG`マクロが定義されていると何もしないコードに置き換えられます。
30
30
 
@@ -84,7 +84,7 @@
84
84
 
85
85
  ---
86
86
 
87
- ~~C言語にこだわらず~~C++(C++11以降)でもよいなら、以下のようにすればコンパイル時にエラーにできます。
87
+ ~~C言語にこだわらず~~C++(C++11以降)~~でもよい~~なら、以下のようにすればコンパイル時にエラーにできます。
88
88
 
89
89
  (追記)C言語も[C11以降なら`_Static_assert`](https://ja.cppreference.com/w/c/language/_Static_assert)が使用でき、[`assert.h`をincludeすれば`#define static_assert _Static_assert`とdefineされる](https://ja.cppreference.com/w/c/error/static_assert)ようです。手元のMinGW gcc9.2.0では`assert.h`にそのような記述は含まれておらずdefineされませんでしたが、`_Static_assert`は使用できました。
90
90
 

9

MinGWgcc9.2.0について加筆

2020/05/09 07:35

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -86,7 +86,7 @@
86
86
 
87
87
  ~~C言語にこだわらず~~C++(C++11以降)でもよいなら、以下のようにすればコンパイル時にエラーにできます。
88
88
 
89
- (追記)C言語も[C11以降なら`_Static_assert`](https://ja.cppreference.com/w/c/language/_Static_assert)が使用でき、[`assert.h`をincludeすれば`#define static_assert _Static_assert`とdefineされる](https://ja.cppreference.com/w/c/error/static_assert)ようです。手元のMinGW gcc9.2.0では`-std=c11`をつけdefineされませんでしたが
89
+ (追記)C言語も[C11以降なら`_Static_assert`](https://ja.cppreference.com/w/c/language/_Static_assert)が使用でき、[`assert.h`をincludeすれば`#define static_assert _Static_assert`とdefineされる](https://ja.cppreference.com/w/c/error/static_assert)ようです。手元のMinGW gcc9.2.0では`assert.h`にそのような記述は含まれおらずdefineされませんでしたが、`_Static_assert`は使用できました。
90
90
 
91
91
  ```C++
92
92
 

8

C11について追記

2020/05/09 05:26

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -84,7 +84,9 @@
84
84
 
85
85
  ---
86
86
 
87
- C言語にこだわらずC++(C++11以降)でもよいなら、以下のようにすればコンパイル時にエラーにできます。
87
+ ~~C言語にこだわらず~~C++(C++11以降)でもよいなら、以下のようにすればコンパイル時にエラーにできます。
88
+
89
+ (追記)C言語も[C11以降なら`_Static_assert`](https://ja.cppreference.com/w/c/language/_Static_assert)が使用でき、[`assert.h`をincludeすれば`#define static_assert _Static_assert`とdefineされる](https://ja.cppreference.com/w/c/error/static_assert)ようです。手元のMinGW gcc9.2.0では`-std=c11`をつけてもdefineされませんでしたが…
88
90
 
89
91
  ```C++
90
92
 

7

static_assertはC++11以降であることを追記

2020/05/09 05:19

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
  ---
86
86
 
87
- C言語にこだわらずC++でもよいなら、以下のようにすればコンパイル時にエラーにできます。
87
+ C言語にこだわらずC++(C++11以降)でもよいなら、以下のようにすればコンパイル時にエラーにできます。
88
88
 
89
89
  ```C++
90
90
 

6

コード修正

2020/05/09 04:34

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -104,28 +104,8 @@
104
104
 
105
105
  const int data_array[] = { 1,2,3 };
106
106
 
107
-
108
-
109
- int main(void)
110
-
111
- {
112
-
113
- static_assert(a_NUM == sizeof(data_array) / sizeof(data_array[0]), "element count != a_NUM");
107
+ static_assert(a_NUM == sizeof(data_array) / sizeof(data_array[0]), "element count != a_NUM");
114
108
 
115
109
 
116
110
 
117
- for (int i = 0; i < a_NUM; i++)
118
-
119
- {
120
-
121
- //data_array[i]を使った処理
122
-
123
- }
124
-
125
-
126
-
127
- return 0;
128
-
129
- }
130
-
131
111
  ```

5

エラーとなるようコードを修正

2020/05/09 04:29

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -45,6 +45,8 @@
45
45
  a2,
46
46
 
47
47
  a3,
48
+
49
+ a4,
48
50
 
49
51
  a_NUM, //この列挙体の要素数
50
52
 
@@ -94,6 +96,8 @@
94
96
 
95
97
  a3,
96
98
 
99
+ a4,
100
+
97
101
  a_NUM, //この列挙体の要素数
98
102
 
99
103
  }eXXX;

4

C++の場合を追記

2020/05/09 04:21

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -77,3 +77,51 @@
77
77
  }
78
78
 
79
79
  ```
80
+
81
+
82
+
83
+ ---
84
+
85
+ C言語にこだわらずC++でもよいなら、以下のようにすればコンパイル時にエラーにできます。
86
+
87
+ ```C++
88
+
89
+ typedef enum {
90
+
91
+ a1 = 0,
92
+
93
+ a2,
94
+
95
+ a3,
96
+
97
+ a_NUM, //この列挙体の要素数
98
+
99
+ }eXXX;
100
+
101
+ const int data_array[] = { 1,2,3 };
102
+
103
+
104
+
105
+ int main(void)
106
+
107
+ {
108
+
109
+ static_assert(a_NUM == sizeof(data_array) / sizeof(data_array[0]), "element count != a_NUM");
110
+
111
+
112
+
113
+ for (int i = 0; i < a_NUM; i++)
114
+
115
+ {
116
+
117
+ //data_array[i]を使った処理
118
+
119
+ }
120
+
121
+
122
+
123
+ return 0;
124
+
125
+ }
126
+
127
+ ```

3

誤字修正

2020/05/09 04:18

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  thkanaさんも書かれていますが、実行時エラーとする[`aseert`](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/assert.3.html)ではだめですか?
28
28
 
29
- 注意:`aseert`は`NDEBUG`マクロが定義されていると何もしないコードに置き換えられます。
29
+ 注意:`aseert`は`NDEBUG`マクロが定義されていると何もしないコードに置き換えられます。
30
30
 
31
31
  gcc/g++なら明示的に`NDEBUG`を定義しなければ`aseert`実行されますが、VisualC++の場合はReleaseビルド時`NDEBUG`が定義されます。
32
32
 

2

質問追記分加筆

2020/05/09 04:01

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -17,3 +17,63 @@
17
17
  要素数に満たない分が0(もしくはヌルポインタ)に初期化されるのはC言語の機能なので、エラーにすることはできません。
18
18
 
19
19
  [配列の初期化](https://ja.cppreference.com/w/c/language/array_initialization)
20
+
21
+
22
+
23
+ ---
24
+
25
+ (質問追記分)
26
+
27
+ thkanaさんも書かれていますが、実行時エラーとする[`aseert`](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/assert.3.html)ではだめですか?
28
+
29
+ 注意:`aseert`は`NDEBUG`マクロがが定義されていると何もしないコードに置き換えられます。
30
+
31
+ gcc/g++なら明示的に`NDEBUG`を定義しなければ`aseert`実行されますが、VisualC++の場合はReleaseビルド時`NDEBUG`が定義されます。
32
+
33
+ VisualC++のReleaseビルド時でもエラー表示したい場合はif文にでも置き換えてください。
34
+
35
+
36
+
37
+ ```C
38
+
39
+ #include <assert.h>
40
+
41
+ typedef enum {
42
+
43
+ a1 = 0,
44
+
45
+ a2,
46
+
47
+ a3,
48
+
49
+ a_NUM, //この列挙体の要素数
50
+
51
+ }eXXX;
52
+
53
+ const int data_array[] = { 1,2,3 };
54
+
55
+
56
+
57
+ int main(void)
58
+
59
+ {
60
+
61
+ assert(a_NUM == sizeof(data_array) / sizeof(data_array[0]));
62
+
63
+
64
+
65
+ for (int i = 0; i < a_NUM; i++)
66
+
67
+ {
68
+
69
+ //data_array[i]を使った処理
70
+
71
+ }
72
+
73
+
74
+
75
+ return 0;
76
+
77
+ }
78
+
79
+ ```

1

0初期化について追記

2020/05/09 04:00

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -9,3 +9,11 @@
9
9
  const size_t DATA_ARRAY_SIZE = sizeof(data_array) / sizeof(data_array[0]);
10
10
 
11
11
  ```
12
+
13
+
14
+
15
+ ---
16
+
17
+ 要素数に満たない分が0(もしくはヌルポインタ)に初期化されるのはC言語の機能なので、エラーにすることはできません。
18
+
19
+ [配列の初期化](https://ja.cppreference.com/w/c/language/array_initialization)