teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

11

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

2020/05/09 10:10

投稿

SHOMI
SHOMI

スコア4079

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

文言修正

2020/05/09 10:10

投稿

SHOMI
SHOMI

スコア4079

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について加筆

2020/05/09 07:35

投稿

SHOMI
SHOMI

スコア4079

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では`-std=c11`をつけdefineされませんでしたが
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について追記

2020/05/09 05:26

投稿

SHOMI
SHOMI

スコア4079

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以降であることを追記

2020/05/09 05:19

投稿

SHOMI
SHOMI

スコア4079

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

コード修正

2020/05/09 04:34

投稿

SHOMI
SHOMI

スコア4079

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

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

2020/05/09 04:29

投稿

SHOMI
SHOMI

スコア4079

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++の場合を追記

2020/05/09 04:21

投稿

SHOMI
SHOMI

スコア4079

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

誤字修正

2020/05/09 04:18

投稿

SHOMI
SHOMI

スコア4079

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

質問追記分加筆

2020/05/09 04:01

投稿

SHOMI
SHOMI

スコア4079

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初期化について追記

2020/05/09 04:00

投稿

SHOMI
SHOMI

スコア4079

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)