回答編集履歴

3

追記

2018/10/12 13:50

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- N1570に次のような記述がありました。
5
+ C言語規格書のドラフトであるN1570に次のような記述がありました。
6
6
 
7
7
  > An identifier currently defined as an object-like macro shall not be redefined by another #define preprocessing directive **unless the second definition is an object-like macro definition and the two replacement lists are identical**.
8
8
 
@@ -12,7 +12,29 @@
12
12
 
13
13
 
14
14
 
15
- マクロ置き換えが全く同一なら問題ない、というふうに読み取れそうです。
15
+ マクロに依る置き換えが全く同一なら問題ない、というふうに読み取れそうです。
16
+
17
+ 試しに次のようなコードを書くと、gccはエラーを吐きます。
18
+
19
+ ```C
20
+
21
+ #define HALF 0.5
22
+
23
+ #define HALF .5
24
+
25
+ ```
26
+
27
+
28
+
29
+ 一方、次のコードは問題なくコンパイルが通ります。
30
+
31
+ ```C
32
+
33
+ #define HALF 0.5
34
+
35
+ #define HALF 0.5
36
+
37
+ ```
16
38
 
17
39
 
18
40
 

2

追記

2018/10/12 13:50

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- 置き換えが全く同一なら問題ない、というふうに読み取れそうです。
15
+ マクロの置き換えが全く同一なら問題ない、というふうに読み取れそうです。
16
16
 
17
17
 
18
18
 

1

追記

2018/10/12 13:42

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -1,3 +1,23 @@
1
+ > 上記のコードでは2重にpi.hがインクルードされていると思うですが,なぜエラーが出ないのしょうか?
2
+
3
+
4
+
5
+ N1570に次のような記述がありました。
6
+
7
+ > An identifier currently defined as an object-like macro shall not be redefined by another #define preprocessing directive **unless the second definition is an object-like macro definition and the two replacement lists are identical**.
8
+
9
+
10
+
11
+ 引用元: [N1570 6.10.3 Macro replacement](https://port70.net/~nsz/c/c11/n1570.html#6.10.3) **太字**は引用者
12
+
13
+
14
+
15
+ 置き換えが全く同一なら問題ない、というふうに読み取れそうです。
16
+
17
+
18
+
19
+ ---
20
+
1
21
  > 「多重インクルードによるエラー」を確認できる例はありますでしょうか?
2
22
 
3
23