回答編集履歴

4

C++20

2018/07/07 16:51

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -108,6 +108,14 @@
108
108
 
109
109
 
110
110
 
111
+ さて、C++20に向けて再び`char8_t`型が[提案されています](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0482r1.html)。
112
+
113
+
114
+
115
+ **もし`char8_t`型が標準入りしたならば、もはや`char`は使うべきではないと言えるでしょう。**
116
+
117
+
118
+
111
119
  ---
112
120
 
113
121
 

3

m

2018/07/07 16:51

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -58,26 +58,26 @@
58
58
 
59
59
 
60
60
 
61
+ |文字列リテラル|型|格納される物|
62
+
63
+ |--|--|--|
64
+
65
+ |`u8""`|`const char[]`|UTF-8|
66
+
67
+
68
+
69
+ が追加されています。
70
+
71
+
72
+
73
+ またC++17では
74
+
75
+
76
+
61
77
  |文字リテラル|型|格納される物|
62
78
 
63
79
  |--|--|--|
64
80
 
65
- |`u8""`|`const char[]`|UTF-8|
66
-
67
-
68
-
69
- が追加されています。
70
-
71
-
72
-
73
- またC++17では
74
-
75
-
76
-
77
- |文字リテラル|型|格納される物|
78
-
79
- |--|--|--|
80
-
81
81
  |`u8''`|`char`|UTF-8|
82
82
 
83
83
 

2

m

2018/07/07 16:44

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- とは **整数を格納する型として** と捉えるべきです。
13
+ とは **整数を格納する型として** と捉えるべきです。文字列、ただし一単位が1byteな文字エンコードを格納する型としては、これまで通り`char`型を用いるべきです。
14
14
 
15
15
 
16
16
 
@@ -146,13 +146,13 @@
146
146
 
147
147
  と書かれているじゃないですか。プログラマーは怠惰であるべきなので、STLを使うほうが楽できます。STLの関数群/クラス群の使い方を調べるには
148
148
 
149
- [https://cpprefjp.github.io/(https://cpprefjp.github.io/)
149
+ [https://cpprefjp.github.io/](https://cpprefjp.github.io/)
150
150
 
151
151
  が便利です(宣伝)
152
152
 
153
153
 
154
154
 
155
- ただしiostream系はC++の`std::cout`のようなスタイルやCの`printf`のようなスタイルともにアキラな問題が存在し、[fmtlib/fmt](https://github.com/fmtlib/fmt)とかを使うべきだということができます。またlocaleはだいたいC/C++問わずぶっ壊れていて使い物になりません
155
+ ただしiostream系はC++の`std::cout`のようなスタイルやCの`printf`のようなスタイルともに明らかな問題が存在し、[fmtlib/fmt](https://github.com/fmtlib/fmt)とかを使うべきだということができます。またlocaleはだいたいC/C++問わずぶっ壊れていて使い物になりません
156
156
 
157
157
 
158
158
 

1

C APIと文字列

2018/07/07 16:42

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -175,3 +175,59 @@
175
175
 
176
176
 
177
177
  C/C++にはUnicodeどうしの文字コード変換を行う方法が存在しないという状態が生じています(C++11で入ったが致命的な欠陥が見つかってC++17でdeprecated)
178
+
179
+
180
+
181
+ ---
182
+
183
+
184
+
185
+ C APIで文字列を受け取る場合のAPI設計について留意するべきことがあります。
186
+
187
+
188
+
189
+ Cだけやっていると
190
+
191
+
192
+
193
+ ```c
194
+
195
+ void foo(char* str);
196
+
197
+ ```
198
+
199
+
200
+
201
+ のようなAPIを作りがちですが、2つの点からこれをするべきではありません。
202
+
203
+
204
+
205
+ 1. 文字列の長さがNULL終端文字に依存している
206
+
207
+ Cでは文字列とはNULL終端するbyte列のことでしたが、これはプログラミングをする上で余計なメモリ確保を強いる事があり、非効率的です。
208
+
209
+ C++ですらC++17で`string_view`なるものが追加され、文字列の先頭へのポインタと長さの構造体のようなクラスを`std::string`と同じインターフェースで扱えるようになったことでNULL終端しない文字列を扱う機会が増えます。
210
+
211
+
212
+
213
+ 2. const修飾されていない
214
+
215
+ const修飾されていないとC++ではこのAPIに文字列リテラルを渡すことができません。
216
+
217
+ また文字列が書き換えられる可能性があるため安全のために一度動的メモリ確保を行いコピーするコストが発生し、著しく実行速度に影響を与えます。
218
+
219
+
220
+
221
+ したがって
222
+
223
+
224
+
225
+ ```c
226
+
227
+ void foo(const char* str, size_t len);
228
+
229
+ ```
230
+
231
+
232
+
233
+ のようにしましょう。