回答編集履歴
11
VisualC++の場合について追記
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
文言修正
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について加筆
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では`
|
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について追記
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以降であることを追記
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
コード修正
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
|
-
|
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
エラーとなるようコードを修正
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++の場合を追記
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
誤字修正
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
質問追記分加筆
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初期化について追記
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)
|