forked from ttsuki/styleguide
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcppguide.ja.html
16219 lines (15211 loc) · 758 KB
/
cppguide.ja.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Google C++ スタイルガイド(日本語全訳) Google C++ Style Guide (Japanese)</title>
<link rel="stylesheet" href="include/styleguide.ja.css">
<script src="include/styleguide.ja.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<style>
/* 翻訳ポップアップ */
span:hover {
background-color: #FaFC;
}
#tip_popup {
position: absolute;
border: 1px solid black;
max-width: 50%;
background-color: #EFF;
padding: 8px;
z-index: 100;
left: -99999px;
}
span.src,
div.src {
display: none;
}
</style>
<script>
// 翻訳ポップアップ
$(document).ready(function () {
$("body").append('<div id="tip_popup"></div>');
var tip = $('#tip_popup');
$("span,div").each(function () {
if ($(this).attr("title")) {
$(this).attr("data-title", $(this).attr("title"));
$(this).removeAttr("title");
$(this).mousemove(function (m) { tip.html($(this).attr("data-title")); });
$(this).mousemove(function (m) { tip.css({ left: (m.pageX + 20) + "px", top: (m.pageY + 20) + "px" }); });
$(this).mouseout(function () { tip.css({ left: "-99999px" }); });
}
else if ($(this).children(".src").html()) {
$(this).mousemove(function (m) { tip.html($(this).children(".src").html()); });
$(this).mousemove(function (m) { tip.css({ left: (m.pageX + 20) + "px", top: (m.pageY + 20) + "px" }); });
$(this).mouseout(function () { tip.css({ left: "-99999px" }); });
}
});
});
</script>
<link rel="shortcut icon" href="https://www.google.com/favicon.ico" />
</head>
<body onload="initStyleGuide();">
<div id="content">
<h1>
<span title="Google C++ Style Guide">Google C++ スタイルガイド</span> 日本語全訳
</h1>
<p>
本ドキュメントは<a href="https://github.com/google/styleguide/">https://github.com/google/styleguide/</a> にて公開されているGoogle C++ Style Guideを日本語に訳したものです。<br>
commit <a href="https://github.com/google/styleguide/blob/8638b2665f29e46a505df55887b28900e4ceb3ff/cppguide.html">8638b26 (Oct 14, 2022)</a> を底本としています。<br>
オリジナルの最新版は <a href="https://google.github.io/styleguide/cppguide.html">https://google.github.io/styleguide/cppguide.html</a>で読むことができます。
</p>
<p>
オリジナルと同様
<a href="https://creativecommons.org/licenses/by/3.0/">CC-By 3.0 License</a>で頒布します。
</p>
<p>
免責: 訳者はGoogleと無関係です。私訳や誤訳を含んでいる恐れがあります。
訳文にマウスを重ねると原文が表示されますので、そちらもあわせて参照してください。
</p>
<p>
誤訳の指摘・改善案は
<a href="https://github.com/ttsuki/styleguide/issues">Issues</a> or
<a href="https://github.com/ttsuki/styleguide/pulls">Pull Requests</a>までお願いします。
</p>
<div class="horizontal_toc" id="tocDiv"></div>
<h2 id="Background" class="ignoreLink">
<span title="Background">本ガイドの背景</span>
</h2>
<p>
<span>
<span class="src">
C++ is one of the main development languages used by
many of Google's open-source projects.
</span>
C++は、多くのGoogleのオープンソースプロジェクトで使われている主要言語のうちのひとつです。
</span>
<span>
<span class="src">
As every C++
programmer knows, the language has many powerful features, but
this power brings with it complexity, which in turn can make
code more bug-prone and harder to read and maintain.
</span>
C++のプログラマなら誰でも知っているように、この言語にはパワフルな機能がありますが、同時に、そのパワフルさが複雑さを招き、バグを発生させやすくしたり、また可読性やメンテナンス性の妨げになったりもしています。
</span>
</p>
<p>
<span>
<span class="src">
The goal of this guide is to manage this complexity by
describing in detail the dos and don'ts of writing C++ code.
</span>
本ガイドの目的は、C++のコードを書く際に、すべきこと、すべきでないことを詳しく説明することによって、この複雑性をコントロール下に置くことです。
</span>
<span>
<span class="src">
These rules exist to
keep the code base manageable while still allowing
coders to use C++ language features productively.
</span>
これらのルールは、C++プログラマが、言語機能の生産性を生かしつつも、コードベースを管理可能な状態に保つために存在します。
</span>
</p>
<p>
<span>
<span class="src">
<em>Style</em>, also known as readability, is what we call
the conventions that govern our C++ code.
</span>
「<em>スタイル</em>」は、可読性(リーダビリティ)としても知られ、私たちのC++コードを管理するための規約のことです。
</span>
<span>
<span class="src">
The term Style is a
bit of a misnomer, since these conventions cover far more than
just source file formatting.
</span>
これらの規約は、単なるソースファイルのフォーマットだけではなく、広い範囲を含むため<em>スタイル</em>という用語はちょっとふさわしくないかもしれません。
</span>
</p>
<p>
<span>
<span class="src">
Most open-source projects developed by
Google conform to the requirements in this guide.
</span>
Googleで開発されるほとんどのオープンソースプロジェクトが、本ガイドに則っています。
</span>
</p>
<p>
<span>
<span class="src">
Note that this guide is not a C++ tutorial: we assume that
the reader is familiar with the language.
</span>
注意してほしいのは、このガイドはC++のチュートリアルではないということです。むしろ、このガイドは読者がC++に精通していることを想定して書かれています。
</span>
</p>
<h3 id="Goals">
<span title="Goals of the Style Guide">本ガイドの目的</span>
</h3>
<p>
<span>
<span class="src">
Why do we have this document?
</span>
なぜ、このガイドは書かれたのでしょうか?
</span>
</p>
<p>
<span>
<span class="src">
There are a few core goals that we believe this guide should
serve.
</span>
本ガイドによって提供される、いくつかの核となる目標があります。
</span>
<span>
<span class="src">
These are the fundamental <b>why</b>s that
underlie all of the individual rules.
</span>
その目標とは、このガイドで示されるすべての個々のルールの根底にある、基礎的な「なぜ」の集まりです。
</span>
<span>
<span class="src">
By bringing these ideas to
the fore, we hope to ground discussions and make it clearer to our
broader community why the rules are in place and why particular
decisions have been made.
</span>
私たちは、この考え方を前面に出すことで、議論を根付かせ、より広範囲のコミュニティにおいて、これらのルールがなぜ作られ、なぜそのように決められたのか、より明確に伝わることを望んでいます。
</span>
<span>
<span class="src">
If you understand what goals each rule is
serving, it should be clearer to everyone when a rule may be waived
(some can be), and what sort of argument or alternative would be
necessary to change a rule in the guide.
</span>
個々のルールがどのような目的を果たそうとしているか理解すれば、いつルールの採用を取りやめるべきか、ルールを変更するためにどんな議論や代替案が必要か、より明確になることでしょう。
</span>
</p>
<p>
<span>
<span class="src">
The goals of the style guide as we currently see them are as
follows:
</span>
本スタイルガイドの目的は、現時点では次のとおりです。
</span>
</p>
<dl>
<dt>
<span>
<span class="src">
Style rules should pull their weight
</span>
スタイルルールを重くしすぎないこと
</span>
</dt>
<dd>
<span>
<span class="src">
The benefit of a style rule
must be large enough to justify asking all of our engineers to
remember it.
</span>
個々のスタイルルールは「所属するすべてのエンジニアが覚えなくてはならない」ことを正当化できるくらいに価値のあるものでなければなりません。
</span>
<span>
<span class="src">
The benefit is measured relative to the codebase we would
get without the rule, so a rule against a very harmful practice may
still have a small benefit if people are unlikely to do it
anyway.
</span>
ルールの価値は「仮にそのルールが無かったら書かれたかもしれないコード」との比較で測定します。仮に「非常に有害な慣行に対するルール」を考えたとしても、「そもそも、そのようなルールがなくとも、普通はそんなことはしない」ならば、そのルールは価値が低いという風に考えます。
</span>
<span>
<span class="src">
This principle mostly explains the rules we don’t have, rather
than the rules we do: for example, <code>goto</code> contravenes many
of the following principles, but is already vanishingly rare, so the Style
Guide doesn’t discuss it.
</span>
この原則は、どちらかというと、本スタイルガイドに書かれていないルールについて説明しています。例えば、<code>goto</code>の濫用はこれに続く多くの原則に違反しますが、すでにそれが行われること自体がレアケースになっています。このため、本ガイドでは<code>goto</code>の濫用については取り扱いません。
</span>
</dd>
<dt>
<span>
<span class="src">
Optimize for the reader, not the writer
</span>
コードの書き手ではなく、コードの読み手にとって優しいこと
</span>
</dt>
<dd>
<span>
<span class="src">
Our codebase (and most individual components submitted to it) is
expected to continue for quite some time.
</span>
我々のコードベース(と、それに含まれるほとんどの個々のコンポーネント)は、今後、長い長い時を経ていくでしょう。
</span> <span>
<span class="src">
As a result, more time will
be spent reading most of our code than writing it.
</span>
結果的に、そのコードを書くのに費やした時間に比べて、はるかに多くの時間がコードを読むために割かれることでしょう。
</span> <span>
<span class="src">
We explicitly
choose to optimize for the experience of our average software engineer
reading, maintaining, and debugging code in our codebase rather than
ease when writing said code.
</span>
私たちは、私たちの平均的なエンジニアが「簡単にコードが書けること」よりも、「コードを読み、メンテし、デバッグがやりやすいこと」に最適化することを明示的に選択します。
</span>
<span>
<span class="src">
"Leave a trace for the reader" is a
particularly common sub-point of this principle:
</span>
特に「コード読者のためのヒントを残す」は、この原則の共通のサブテーマになっています。
</span>
<span>
<span class="src">
When something
surprising or unusual is happening in a snippet of code (for example,
transfer of pointer ownership), leaving textual hints for the reader
at the point of use is valuable (<code>std::unique_ptr</code>
demonstrates the ownership transfer unambiguously at the call
site).
</span>
コードの中で見慣れないことをするとき(たとえばポインタの所有権を移す)、読み手のためにヒントを残しておくことは価値があります(ただのポインタではなく、<code>std::unique_ptr</code>を使えば、所有権が移されることを曖昧性なく表現できます)。
</span>
</dd>
<dt>
<span>
<span class="src">
Be consistent with existing code
</span>
既存のコードと一貫性が保たれていること
</span>
</dt>
<dd>
<span>
<span class="src">
Using one style consistently through our codebase lets us focus on
other (more important) issues.
</span>
1つのスタイルをコードベース全体で一貫して用いることで、私たちは他の(より重要な)問題にフォーカスすることができます。
</span>
<span>
<span class="src">
Consistency also allows for automation:
tools that format your code or adjust your <code>#include</code>s only
work properly when your code is consistent with the expectations of
the tooling.
</span>
一貫性は自動化を進めやすくもします。コードフォーマットツールは、あなたのコードがツールの期待と一貫しているときにのみきちんと動作するでしょう。
</span>
<span>
<span class="src">
In many cases, rules that are attributed to "Be
Consistent" boil down to "Just pick one and stop worrying about it";
</span>
多くの場合「一貫性を保つ」に帰結するルールは「ある1つのやり方を選ぶと決め、それについて悩むことをやめる」ということです。
</span>
<span>
<span class="src">
the potential value of allowing flexibility on these points is
outweighed by the cost of having people argue over them.
</span>
これらの点で多様性を認めることによって得られる潜在的な価値よりも、それについて議論するコストの方が上回る場合がほとんどでしょう。
</span>
<span>
<span class="src">
However,
there are limits to consistency; it is a good tie breaker when there
is no clear technical argument, nor a long-term direction.
</span>
その一方で、一貫性には限界があります。一貫性は、明確な技術的論拠や長期的な方向性がない場合には、よい判断材料となるでしょう。
</span>
<span>
<span class="src">
It applies
more heavily locally (per file, or for a tightly-related set of
interfaces).
</span>
ローカル(ファイルごと、もしくは密に関連するインターフェイスの集合)には、より重く適用されます。
</span>
<span>
<span class="src">
Consistency should not generally be used as a
justification to do things in an old style without considering the
benefits of the new style, or the tendency of the codebase to converge
on newer styles over time.
</span>
新しいスタイルの利点や、コードベースが時間とともに新しいスタイルに移り変わっていく傾向を無視して、古いスタイルのまま物事を進めるための言い訳として、一貫性を用いるべきではありません。
</span>
</dd>
<dt>
<span>
<span class="src">
Be consistent with the broader C++ community when appropriate
</span>
より広範囲なC++コミュニティと一貫性があること
</span>
</dt>
<dd>
<span>
<span class="src">
Consistency with the way other organizations use C++ has value for
the same reasons as consistency within our code base.
</span>
C++を使う他の組織の手法と一貫性を保つことも、我々のコードベース内で一貫性を保つことと同じ理由で価値があります。
</span><span>
<span class="src">
If a feature in
the C++ standard solves a problem, or if some idiom is widely known
and accepted, that's an argument for using it.
</span>
もし、あるC++標準の機能を使って問題を解決できるのならば、あるいは、あるイディオムが広く知られて受け入れられているのならば、それを使う理由になるでしょう。
</span> <span>
<span class="src">
However, sometimes
standard features and idioms are flawed, or were just designed without
our codebase's needs in mind.
</span>
しかし、時折、標準的な機能やイディオムには、不備があったり、あるいは単に私たちのコードベースのニーズを満たさない形でデザインされていたりします。
</span> <span>
<span class="src">
In those cases (as described below) it's
appropriate to constrain or ban standard features.
</span>
後述しますが、そのような場合は、これらの標準機能は制限または禁止する方が適切です。
</span> <span>
<span class="src">
In some cases we
prefer a homegrown or third-party library over a library defined in
the C++ Standard, either out of perceived superiority or insufficient
value to transition the codebase to the standard interface.
</span>
いくつかのケースでは、C++標準ライブラリよりも自家製もしくはサードパーティのライブラリを選ぶ場合もあります。そちらの方が優れていたり、コードベースを標準のインターフェースに移行する十分な価値がなかったりするためです。
</span>
</dd>
<dt>
<span>
<span class="src">
Avoid surprising or dangerous constructs
</span>
見慣れない構成や危険な構成は避けること
</span>
</dt>
<dd>
<span>
<span class="src">
C++ has features that are more surprising or dangerous than one
might think at a glance.
</span>
C++には、ちょっと考えただけでは気が付かないかもしれない、驚くような、あるいは危険な機能も存在します。
</span> <span>
<span class="src">
Some style guide restrictions are in place to
prevent falling into these pitfalls.
</span>
本ガイドのいくつかの制限ルールは、それらの落とし穴を避けるためのものです。
</span> <span>
<span class="src">
There is a high bar for style
guide waivers on such restrictions, because waiving such rules often
directly risks compromising program correctness.
</span>
これらのルールを取り消すと、直接的にプログラムの正しさを損なう危険性があるため、そのようなルールの破棄については高いハードルがあります。
</span>
</dd>
<dt>
<span>
<span class="src">
Avoid constructs that our average C++ programmer would find tricky
or hard to maintain
</span>
平均的なC++プログラマがトリッキーと感じたり、メンテしにくいと感じたりするような構成は避けること
</span>
</dt>
<dd>
<span>
<span class="src">
C++ has features that may not be generally appropriate because of
the complexity they introduce to the code.
</span>
C++には、複雑すぎて通常はコードに導入すべきでないような機能もあります。
</span> <span>
<span class="src">
In widely used
code, it may be more acceptable to use
trickier language constructs, because any benefits of more complex
implementation are multiplied widely by usage, and the cost in understanding
the complexity does not need to be paid again when working with new
portions of the codebase.
</span>
広く使われているコードの中は、トリッキーな言語構造の方が受け入れられることもあるかもしれません。その理由は、その複雑な実装が使用されることによって価値が広く倍増しており、かつ、コードベースの新しい部分で仕事をする時には、その複雑さを再度理解するためのコストを払う必要がなくなっているからです。
</span> <span>
<span class="src">
When in doubt, waivers to rules of this type
can be sought by asking your project leads.
</span>
これについて疑問を感じる場合は、このタイプのルールを取り消すことについてプロジェクトリーダーと相談してください。
</span> <span>
<span class="src">
This is specifically
important for our codebase because code ownership and team membership
changes over time: even if everyone that works with some piece of code
currently understands it, such understanding is not guaranteed to hold a
few years from now.
</span>
これは我々のコードベースでは特に重要です。なぜなら、コードの担当者やチームメンバーは時とともに変わっていくからです。現時点で全員がそのコードを理解していたとしても、その状態が今から2年後にも保たれている保証はどこにもありません。
</span>
</dd>
<dt>
<span>
<span class="src">
Be mindful of our scale
</span>
我々の「規模」に留意すること
</span>
</dt>
<dd>
<span>
<span class="src">
With a codebase of 100+ million lines and thousands of engineers,
some mistakes and simplifications for one engineer can become costly
for many.
</span>
1億行以上のコードベースがあり、何千人ものエンジニアがいる状況において、ある一人のエンジニアのミスや単純化が、非常に高いコストを招くことがあります。
</span> <span>
<span class="src">
For instance it's particularly important to
avoid polluting the global namespace: name collisions across a
codebase of hundreds of millions of lines are difficult to work with
and hard to avoid if everyone puts things into the global
namespace.
</span>
たとえば、グローバル名前空間汚染を避けることは非常に重要です。何億行ものコードベースの間で、もし、誰もがグローバル名前空間に何でもかんでもおいていたら、名前の衝突を避けるのは困難でしょう。
</span>
</dd>
<dt>
<span>
<span class="src">
Concede to optimization when necessary
</span>
必要な最適化は容認する
</span>
</dt>
<dd>
<span>
<span class="src">
Performance optimizations can sometimes be necessary and
appropriate, even when they conflict with the other principles of this
document.
</span>
たとえ本ガイドのルールと競合したとしても、ときにパフォーマンスの最適化が必要で、かつ適切な場合もあります。
</span>
</dd>
</dl>
<p>
<span>
<span class="src">
The intent of this document is to provide maximal guidance with
reasonable restriction.
</span>
本文書の趣旨は、理にかなった制限の下での最大限の道しるべを提供することです。
</span>
<span>
<span class="src">
As always, common sense and good taste should
prevail.
</span>
いつもどおり、常識や良識が優先されるべきです。
</span>
<span>
<span class="src">
By this we specifically refer to the established conventions
of the entire Google C++ community, not just your personal preferences
or those of your team.
</span>
このガイダンスは、あなた個人の好みやチームの好みについてだけではなく、GoogleのC++コミュニティ全体で確立された慣習に言及しています。
</span>
<span>
<span class="src">
Be skeptical about and reluctant to use
clever or unusual constructs: the absence of a prohibition is not the
same as a license to proceed.
</span>
巧妙(clever)な構成、見慣れない構成に対して、懐疑的な姿勢を持ち、避けるようにしてください(禁止されていなければやってもよい、というわけではありません)。
</span>
<span>
<span class="src">
Use your judgment, and if you are
unsure, please don't hesitate to ask your project leads to get additional
input.
</span>
自分の判断に従ってください。ルールに対して不明な点がある場合は、ためらわず自プロジェクトのリーダーに対して質問し、更なるインプットを得てください。
</span>
</p>
<h2 id="C++_Version">
<span title="C++ Version">C++のバージョン</span>
</h2>
<p>
<span>
<span class="src">
Currently, code should target C++17, i.e., should not use C++2x
features, with the exception of <a href="#Designated_initializers">designated
initializers</a>.
</span>
現状、コードはC++17をターゲットとします。C++2xの機能は<a href="#Designated_initializers">指示付き初期化子</a>を除いて使うべきではありません。
</span>
<span>
<span class="src">
The C++ version targeted by this guide will advance
(aggressively) over time.
</span>
このガイドがターゲットとするC++のバージョンは、時とともに(かつ積極的に)進行します。
</span>
</p>
<p>
<span>
<span class="src">
Do not use
<a href="#Nonstandard_Extensions">non-standard extensions</a>.
</span>
<a href="#Nonstandard_Extensions">非標準の拡張</a>は使わないでください。
</span>
</p>
<p>
<span>
<span class="src">
Consider portability to other environments
before using features from C++14 and C++17 in your project.
</span>
C++14やC++17からの新機能を使用する際は、他の環境への移植性について配慮してください。
</span>
</p>
<h2 id="Header_Files">
<span title="Header Files">ヘッダーファイル</span>
</h2>
<p>
<span>
<span class="src">
In general, every <code>.cc</code> file should have an
associated <code>.h</code> file.
</span>
原則的に、全ての<code>.cc</code>ファイルは、それに紐付く<code>.h</code>ファイルを持つようにします。
</span>
<span>
<span class="src">
There are some common
exceptions, such as unit tests and
small <code>.cc</code> files containing just a
<code>main()</code> function.
</span>
ただし、ユニットテストや<code>main()</code>だけを含むような小さな<code>.cc</code>は例外です。
</span>
</p>
<p>
<span>
<span class="src">
Correct use of header files can make a huge difference to
the readability, size and performance of your code.
</span>
正しくヘッダーファイルを扱うことは、コードの可読性やサイズ、パフォーマンスに大きな違いをもたらします。
</span>
</p>
<p>
<span>
<span class="src">
The following rules will guide you through the various
pitfalls of using header files.
</span>
以下のルールはヘッダーファイルに関する様々な落とし穴を避けて通るための道しるべとなるはずです。
</span>
</p>
<a id="The_-inl.h_Files"></a>
<h3 id="Self_contained_Headers">
<span title="Self-contained Headers">自己完結型ヘッダー</span>
</h3>
<p>
<span>
<span class="src">
Header files should be self-contained (compile on their own) and
end in <code>.h</code>.
</span>
ヘッダーファイルは自己完結(単体でコンパイルできる)していなくてはならず、名前は<code>.h</code>で終わります。
</span>
<span>
<span class="src">
Non-header files that are meant for inclusion
should end in <code>.inc</code> and be used sparingly.
</span>
ヘッダーファイルではない、includeして使われるべきものは<code>.inc</code>で終わるようにしますが、なるべく使用は控えるようにしましょう。
</span>
</p>
<p>
<span>
<span class="src">
All header files should be self-contained.
</span>
すべてのヘッダーは自己完結していなくてはなりません。
</span>
<span>
<span class="src">
Users and refactoring
tools should not have to adhere to special conditions to include the
header.
</span>
ヘッダーの使用者やリファクタリングツールは、そのヘッダーがincludeされる際に、なんら特別な条件を守る必要がないようにします。
</span>
<span>
<span class="src">
Specifically, a header should
have <a href="#The__define_Guard">header guards</a> and include all
other headers it needs.
</span>
特に、ヘッダーには<a href="#The__define_Guard">インクルードガード</a>を持たせ、そのヘッダー自身が必要とするすべての他のヘッダーをincludeします。
</span>
</p>
<p>
<span>
<span class="src">
When a header declares inline functions or templates that clients of the
header will instantiate, the inline functions and templates must also have
definitions in the header, either directly or in files it includes.
</span>
ヘッダーが、インライン関数や、そのヘッダーの利用側でインスタンス化するテンプレートを宣言している場合、それらインライン関数やテンプレートの定義もまた同ヘッダー内もしくは同ヘッダーからインクルードされるファイルの中で行われなければなりません。
</span>
<span>
<span class="src">
Do not move
these definitions to separately included header (<code>-inl.h</code>) files;
this practice was common in the past, but is no longer allowed.
</span>
これらの定義を別途インクルードされるヘッダーファイル (<code>-inl.h</code>) に移動しないでください。
昔は、そのやり方が一般的でしたが、現在ではもはや許容されません。
</span>
<span>
<span class="src">
When all
instantiations of a template occur in one <code>.cc</code> file, either because
they're <a href="https://en.cppreference.com/w/cpp/language/class_template#Explicit_instantiation">
explicit</a> or because the definition is accessible to only
the <code>.cc</code> file, the template definition can be kept in that file.
</span>
<a href="https://en.cppreference.com/w/cpp/language/class_template#Explicit_instantiation">テンプレートのインスタンス化が明示的に行われる</a>、あるいは、そもそもそのテンプレートの定義にアクセスできる<code>.cc</code>ファイルが1つしかない等の理由で、すべてのテンプレートのインスタンス化が単一の<code>.cc</code>ファイル内でのみ行われる場合には、テンプレートの定義はそのファイルに残してもかまいません。
</span>
</p>
<p>
<span>
<span class="src">
There are rare cases where a file designed to be included is not
self-contained.
</span>
レアケースながら、includeされるが自己完結でないようなデザインも存在します。
</span>
<span>
<span class="src">
These are typically intended to be included at unusual
locations, such as the middle of another file.
</span>
これらはたいていの場合、別のファイルの途中(中ほど)など、変わった場所でinlucdeされることを想定しています。
</span>
<span>
<span class="src">
They might not
use <a href="#The__define_Guard">header guards</a>, and might not include their prerequisites.
</span>
それらのファイルは、<a href="#The__define_Guard">インクルードガード</a>を持っていなかったり、そのヘッダー内で必要なものをincludeしていなかったりします。
</span>
<span>
<span class="src">
Name such files with the <code>.inc</code>
extension.
</span>
このようなファイルには、<code>.inc</code>拡張子を持たせるようにします。
</span>
<span>
<span class="src">
Use sparingly, and prefer self-contained headers when possible.
</span>
また、なるべく使用は避け、可能な限り自己完結型ヘッダーを使うことを選択しましょう。
</span>
</p>
<h3 id="The__define_Guard">
<span title="The #define Guard">インクルードガード</span>
</h3>
<p>
<span>
<span class="src">
All header files should have <code>#define</code> guards to
prevent multiple inclusion.
</span>
すべてのヘッダーファイルは、インクルードガード(<code>#define</code> guards)を持たなくてはなりません。
</span>
<span>
<span class="src">
The format of the symbol name
should be
<code><i><PROJECT></i>_<i><PATH></i>_<i><FILE></i>_H_</code>.
</span>
その際のシンボル名は<code><i><PROJECT></i>_<i><PATH></i>_<i><FILE></i>_H_</code>の形でなくてはなりません。
</span>
</p>
<p>
<span>
<span class="src">
To guarantee uniqueness, they should
be based on the full path in a project's source tree.
</span>
ユニーク性を保証するため、プロジェクト内ソースツリーのフルパスに基づくものにします。
</span>
<span>
<span class="src">
For example, the file <code>foo/src/bar/baz.h</code> in
project <code>foo</code> should have the following
guard:
</span>
たとえば、プロジェクトfooに含まれるファイル<code>foo/src/bar/baz.h</code>のガードは次のようにします。
</span>
</p>
<pre>#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif // FOO_BAR_BAZ_H_
</pre>
<h3 id="Include_What_You_Use"><span title="Include What You Use">必要なものはインクルードする</span></h3>
<p>
<span>
<span class="src">
If a source or header file refers to a symbol defined elsewhere,
the file should directly include a header file which properly intends
to provide a declaration or definition of that symbol.
</span>
ソースファイルやヘッダーファイルから他の場所で定義されたシンボルを参照する場合、そのシンボルの宣言・定義の提供が意図されたヘッダーファイルを直接インクルードするようにします。
</span>
<span>
<span class="src">
It should not
include header files for any other reason.
</span>
それ以外の理由ではヘッダーファイルをインクルードすべきではありません。
</span>
</p>
<p>
<span>
<span class="src">
Do not rely on transitive inclusions.
</span>
遷移的・間接的なインクルードに頼ってはいけません。
</span>
<span>
<span class="src">
This allows people to remove
no-longer-needed <code>#include</code> statements from their headers without
breaking clients.
</span>
遷移的なインクルードを行っていると、ヘッダーの作者が、ヘッダー内で不要になった<code>#include</code>を削除した場合に、クライアントのコードが壊れてしまうことがあります。
</span>
<span>
<span class="src">
This also applies to related headers
- <code>foo.cc</code> should include <code>bar.h</code> if it uses a
symbol from it even if <code>foo.h</code>
includes <code>bar.h</code>.
</span>
これは紐付くヘッダーにも適用されます。たとえば<code>foo.cc</code>で<code>bar.h</code>のシンボルを使用する場合に、
たとえ<code>foo.h</code>において既に<code>bar.h</code>をインクルードしていたとしても、<code>foo.cc</code>で改めて<code>bar.h</code>をインクルードすべきということです。
</span>
</p>
<h3 id="Forward_Declarations">
<span title="Forward Declarations">前方宣言</span>
</h3>
<p>
<span>
<span class="src">
Avoid using forward declarations where possible.
</span>
前方宣言は可能な限り避けましょう。
</span>
<span>
<span class="src">
Instead, <a href="#Include_What_You_Use">include the headers you need</a>.
</span>
そのかわりに<a href="#Include_What_You_Use">必要なヘッダーをinclude</a>してください。
</span>
</p>
<p class="definition"></p>
<p>
<span>
<span class="src">
A "forward declaration" is a declaration of an entity
without an associated definition.
</span>
前方宣言とは、関連付く定義のない何らかの宣言のことです。
</span>
</p>
<pre>// In a C++ source file:
class B;
void FuncInB();
extern int variable_in_b;
ABSL_DECLARE_FLAG(flag_in_b);
</pre>
<p class="pros"></p>
<ul>
<li>
<span>
<span class="src">
Forward declarations can save compile time, as
<code>#include</code>s force the compiler to open
more files and process more input.
</span>
前方宣言を用いると、コンパイラが<code>#include</code>によって多数のファイルを開いて処理する分のコンパイル時間を節約することができます。
</span>
</li>
<li>
<span>
<span class="src">
Forward declarations can save on unnecessary
recompilation.
</span>
前方宣言は、不必要な再コンパイルを抑えることができます。
</span>
<span>
<span class="src">
<code>#include</code>s can force
your code to be recompiled more often, due to unrelated
changes in the header.
</span>
<code>#include</code>は、ヘッダーの変更があなたのコードに無関係な場合でもコードを再コンパイルする必要があるため、再コンパイルの頻度が上がります。
</span>
</li>
</ul>
<p class="cons"></p>
<ul>
<li>
<span>
<span class="src">
Forward declarations can hide a dependency, allowing
user code to skip necessary recompilation when headers
change.
</span>
前方宣言は、依存性を隠してしまうため、実際には必要なコードの再コンパイルをスキップさせてしまうことがあります。
</span>
</li>
<li>
<span>
<span class="src">
A forward declaration as opposed to an #include statement
makes it difficult for automatic tooling to discover the module
defining the symbol.
</span>
自動化ツールを利用する場合に、前方宣言は<code>#include</code>に比べて、シンボルを定義するモジュールを発見させることが難しくなります。
</span>
</li>
<li>
<span>
<span class="src">
A forward declaration may be broken by subsequent
changes to the library.
</span>
前方宣言は、将来のライブラリ側の変更によって壊れることがあります。
</span>
<span>
<span class="src">
Forward declarations of functions
and templates can prevent the header owners from making
otherwise-compatible changes to their APIs, such as
widening a parameter type, adding a template parameter
with a default value, or migrating to a new namespace.
</span>
関数やテンプレートの前方宣言があると、ヘッダーのメンテナが、APIに対して互換性のない変更(パラメータの型を拡張したり、デフォルト値とともにテンプレートパラメータを増やしたり、新しい名前空間への移行したり)を行う際に妨げとなる場合があります。
</span>
</li>
<li>
<span>
<span class="src">
Forward declaring symbols from namespace
<code>std::</code> yields undefined behavior.
</span>
<code>std::</code>名前空間のシンボルに対する前方宣言は未定義動作を引き起こします。
</span>
</li>
<li>
<span>
<span class="src">