回答編集履歴
11
VisualC++の場合について追記
answer
CHANGED
@@ -43,6 +43,7 @@
|
|
43
43
|
---
|
44
44
|
~~C言語にこだわらず~~C++(C++11以降)~~でもよい~~なら、以下のようにすればコンパイル時にエラーにできます。
|
45
45
|
(追記)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`は使用できました。
|
46
|
+
VisualC++のC言語はC90(C89)なので`_Static_assert`は使用できませんが、`static_assert`は使えるようです。
|
46
47
|
```C++
|
47
48
|
typedef enum {
|
48
49
|
a1 = 0,
|
10
文言修正
answer
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
---
|
13
13
|
(質問追記分)
|
14
|
-
thkanaさんも書かれていますが、実行時エラーとする[`aseert`](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/assert.3.html)ではだめですか?
|
14
|
+
コメントでthkanaさんも書かれていますが、実行時エラーとする[`aseert`](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/assert.3.html)ではだめですか?
|
15
15
|
注意:`aseert`は`NDEBUG`マクロが定義されていると何もしないコードに置き換えられます。
|
16
16
|
gcc/g++なら明示的に`NDEBUG`を定義しなければ`aseert`実行されますが、VisualC++の場合はReleaseビルド時`NDEBUG`が定義されます。
|
17
17
|
VisualC++のReleaseビルド時でもエラー表示したい場合はif文にでも置き換えてください。
|
@@ -41,7 +41,7 @@
|
|
41
41
|
```
|
42
42
|
|
43
43
|
---
|
44
|
-
~~C言語にこだわらず~~C++(C++11以降)でもよいなら、以下のようにすればコンパイル時にエラーにできます。
|
44
|
+
~~C言語にこだわらず~~C++(C++11以降)~~でもよい~~なら、以下のようにすればコンパイル時にエラーにできます。
|
45
45
|
(追記)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`は使用できました。
|
46
46
|
```C++
|
47
47
|
typedef enum {
|
9
MinGWgcc9.2.0について加筆
answer
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
|
43
43
|
---
|
44
44
|
~~C言語にこだわらず~~C++(C++11以降)でもよいなら、以下のようにすればコンパイル時にエラーにできます。
|
45
|
-
(追記)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では`
|
45
|
+
(追記)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`は使用できました。
|
46
46
|
```C++
|
47
47
|
typedef enum {
|
48
48
|
a1 = 0,
|
8
C11について追記
answer
CHANGED
@@ -41,7 +41,8 @@
|
|
41
41
|
```
|
42
42
|
|
43
43
|
---
|
44
|
-
C言語にこだわらずC++(C++11以降)でもよいなら、以下のようにすればコンパイル時にエラーにできます。
|
44
|
+
~~C言語にこだわらず~~C++(C++11以降)でもよいなら、以下のようにすればコンパイル時にエラーにできます。
|
45
|
+
(追記)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されませんでしたが…
|
45
46
|
```C++
|
46
47
|
typedef enum {
|
47
48
|
a1 = 0,
|
7
static_assertはC++11以降であることを追記
answer
CHANGED
@@ -41,7 +41,7 @@
|
|
41
41
|
```
|
42
42
|
|
43
43
|
---
|
44
|
-
C言語にこだわらずC++でもよいなら、以下のようにすればコンパイル時にエラーにできます。
|
44
|
+
C言語にこだわらずC++(C++11以降)でもよいなら、以下のようにすればコンパイル時にエラーにできます。
|
45
45
|
```C++
|
46
46
|
typedef enum {
|
47
47
|
a1 = 0,
|
6
コード修正
answer
CHANGED
@@ -51,16 +51,6 @@
|
|
51
51
|
a_NUM, //この列挙体の要素数
|
52
52
|
}eXXX;
|
53
53
|
const int data_array[] = { 1,2,3 };
|
54
|
+
static_assert(a_NUM == sizeof(data_array) / sizeof(data_array[0]), "element count != a_NUM");
|
54
55
|
|
55
|
-
int main(void)
|
56
|
-
{
|
57
|
-
static_assert(a_NUM == sizeof(data_array) / sizeof(data_array[0]), "element count != a_NUM");
|
58
|
-
|
59
|
-
for (int i = 0; i < a_NUM; i++)
|
60
|
-
{
|
61
|
-
//data_array[i]を使った処理
|
62
|
-
}
|
63
|
-
|
64
|
-
return 0;
|
65
|
-
}
|
66
56
|
```
|
5
エラーとなるようコードを修正
answer
CHANGED
@@ -22,6 +22,7 @@
|
|
22
22
|
a1 = 0,
|
23
23
|
a2,
|
24
24
|
a3,
|
25
|
+
a4,
|
25
26
|
a_NUM, //この列挙体の要素数
|
26
27
|
}eXXX;
|
27
28
|
const int data_array[] = { 1,2,3 };
|
@@ -46,6 +47,7 @@
|
|
46
47
|
a1 = 0,
|
47
48
|
a2,
|
48
49
|
a3,
|
50
|
+
a4,
|
49
51
|
a_NUM, //この列挙体の要素数
|
50
52
|
}eXXX;
|
51
53
|
const int data_array[] = { 1,2,3 };
|
4
C++の場合を追記
answer
CHANGED
@@ -37,4 +37,28 @@
|
|
37
37
|
|
38
38
|
return 0;
|
39
39
|
}
|
40
|
+
```
|
41
|
+
|
42
|
+
---
|
43
|
+
C言語にこだわらずC++でもよいなら、以下のようにすればコンパイル時にエラーにできます。
|
44
|
+
```C++
|
45
|
+
typedef enum {
|
46
|
+
a1 = 0,
|
47
|
+
a2,
|
48
|
+
a3,
|
49
|
+
a_NUM, //この列挙体の要素数
|
50
|
+
}eXXX;
|
51
|
+
const int data_array[] = { 1,2,3 };
|
52
|
+
|
53
|
+
int main(void)
|
54
|
+
{
|
55
|
+
static_assert(a_NUM == sizeof(data_array) / sizeof(data_array[0]), "element count != a_NUM");
|
56
|
+
|
57
|
+
for (int i = 0; i < a_NUM; i++)
|
58
|
+
{
|
59
|
+
//data_array[i]を使った処理
|
60
|
+
}
|
61
|
+
|
62
|
+
return 0;
|
63
|
+
}
|
40
64
|
```
|
3
誤字修正
answer
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
---
|
13
13
|
(質問追記分)
|
14
14
|
thkanaさんも書かれていますが、実行時エラーとする[`aseert`](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/assert.3.html)ではだめですか?
|
15
|
-
注意:`aseert`は`NDEBUG`マクロが
|
15
|
+
注意:`aseert`は`NDEBUG`マクロが定義されていると何もしないコードに置き換えられます。
|
16
16
|
gcc/g++なら明示的に`NDEBUG`を定義しなければ`aseert`実行されますが、VisualC++の場合はReleaseビルド時`NDEBUG`が定義されます。
|
17
17
|
VisualC++のReleaseビルド時でもエラー表示したい場合はif文にでも置き換えてください。
|
18
18
|
|
2
質問追記分加筆
answer
CHANGED
@@ -7,4 +7,34 @@
|
|
7
7
|
|
8
8
|
---
|
9
9
|
要素数に満たない分が0(もしくはヌルポインタ)に初期化されるのはC言語の機能なので、エラーにすることはできません。
|
10
|
-
[配列の初期化](https://ja.cppreference.com/w/c/language/array_initialization)
|
10
|
+
[配列の初期化](https://ja.cppreference.com/w/c/language/array_initialization)
|
11
|
+
|
12
|
+
---
|
13
|
+
(質問追記分)
|
14
|
+
thkanaさんも書かれていますが、実行時エラーとする[`aseert`](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/assert.3.html)ではだめですか?
|
15
|
+
注意:`aseert`は`NDEBUG`マクロがが定義されていると何もしないコードに置き換えられます。
|
16
|
+
gcc/g++なら明示的に`NDEBUG`を定義しなければ`aseert`実行されますが、VisualC++の場合はReleaseビルド時`NDEBUG`が定義されます。
|
17
|
+
VisualC++のReleaseビルド時でもエラー表示したい場合はif文にでも置き換えてください。
|
18
|
+
|
19
|
+
```C
|
20
|
+
#include <assert.h>
|
21
|
+
typedef enum {
|
22
|
+
a1 = 0,
|
23
|
+
a2,
|
24
|
+
a3,
|
25
|
+
a_NUM, //この列挙体の要素数
|
26
|
+
}eXXX;
|
27
|
+
const int data_array[] = { 1,2,3 };
|
28
|
+
|
29
|
+
int main(void)
|
30
|
+
{
|
31
|
+
assert(a_NUM == sizeof(data_array) / sizeof(data_array[0]));
|
32
|
+
|
33
|
+
for (int i = 0; i < a_NUM; i++)
|
34
|
+
{
|
35
|
+
//data_array[i]を使った処理
|
36
|
+
}
|
37
|
+
|
38
|
+
return 0;
|
39
|
+
}
|
40
|
+
```
|
1
0初期化について追記
answer
CHANGED
@@ -3,4 +3,8 @@
|
|
3
3
|
```C
|
4
4
|
const int data_array[] = { 1,2,3,4,5 };
|
5
5
|
const size_t DATA_ARRAY_SIZE = sizeof(data_array) / sizeof(data_array[0]);
|
6
|
-
```
|
6
|
+
```
|
7
|
+
|
8
|
+
---
|
9
|
+
要素数に満たない分が0(もしくはヌルポインタ)に初期化されるのはC言語の機能なので、エラーにすることはできません。
|
10
|
+
[配列の初期化](https://ja.cppreference.com/w/c/language/array_initialization)
|