はじめに(Introduction)
N4910 Working Draft, Standard for Programming Language C++
C++ n4910は、ISO/IEC JTC1 SC22 WG21の作業原案(Working Draft)です。
公式のISO/IEC 14882原本ではありません。
ISO/IEC JTC1 SC22 のWG21を含むいくつかのWGでは、可能な限り作業文書を公開し、幅広い意見を求めています。
ISO/IEC JTC1 SC7からISO/IEC JTC1 SC22リエゾンとして、2000年頃、C/C++の品質向上に貢献しようとした活動をしていたことがあります。その頃は、まだISO/IEC TS 17961の原案が出る前です。Cの精神が優勢で、セキュリティ対策は補助的な位置付けでした。ISO/IEC TS 17961の制定と、C/C++のライブラリ類の見直しと、C++の進化はどんどん進んでいきます。
進化の具合が、どちらに行こうとしているかは、コンパイルて実行させてみないとわかりません。C/C++の規格案の電子ファイルは、そのままコンパイルできる形式であるとよいと主張してきました。MISRA-C/C++, CERTC/C++でも同様です。MISRA-C/C++は、Example Suiteという形で、コード断片をコンパイルできる形で提供するようになりました。
一連の記事はコード断片をコンパイルできる形にする方法を検討してコンパイル、リンク、実行して、規格案の原文と処理系(g++, Clang++)との違いを確認し、技術内容を検討し、ISO/IEC JTC1 SC22 WG21にフィードバックするために用います。
また、CERT C++, MISRA C++等のコーディング標準のコード断片をコンパイルする際の参考にさせていただこうと考えています。CERT C++, MISRA C++が標準化の動きとの時間的なずれがあれば確認できれば幸いです。また、boostライブラリとの関連、Linux OS, 箱庭プロジェクト、g++(GCC), clang++(LLVM)との関係も調査中です。
何か、抜け漏れ、耳より情報がありましたらおしらせくださると幸いです。
背景(back ground)
C/C++でコンパイルエラーが出ると、途方にくれることがしばしばあります。
何回かに1回は、該当するエラーが検索できます。
ただ、条件が違っていて、そこでの修正方法では目的を達成しないこともしばしばです。いろいろな条件のコンパイルエラーとその対応方法について、広く記録することによって、いつか同じエラーに遭遇した時にやくに立つことを目指しています。
この半年の間で、三度、自分のネットでの記録に助けられたことがあります。
また過去に解決できなかった記録を10種類以上、最近になって解決できたことがあります。それは、主に次の3つの情報に基づいています。
cpprefjp - C++日本語リファレンス
コンパイラの実装状況
また
https://researchmap.jp/joub9b3my-1797580/#_1797580
に記載したサイトのお世話になっています。
作業方針(sequence)
Clang++では-std=c++03, C++2bの2種類
g++では-std=c++03, c++2bの2種類
でコンパイルし、
1)コンパイルエラーを収集する。
2)コンパイルエラーをなくす方法を検討する。
コンパイルエラーになる例を示すだけが目的のコードは、コンパイルエラーをなくすのではなく、コンパイルエラーの種類を収集するだけにする。
文法を示すのが目的のコード場合に、コンパイルエラーをなくすのに手間がかかる場合は、順次作業します。
3)リンクエラーをなくす方法を検討する。
文法を示すのが目的のコード場合に、リンクエラーをなくすのに手間がかかる場合は、順次作業します。
4)意味のある出力を作る。
コンパイル、リンクが通っても、意味のある出力を示そうとすると、コンパイル・リンクエラーが出て収拾できそうにない場合がある。順次作業します。
1)だけのものから4)まで進んだものと色々ある状態です。一歩でも前に進むご助言をお待ちしています。「検討事項」の欄に現状を記録するようにしています。
C++N4910:2022 Standard Working Draft on ISO/IEC 14882(0) sample code compile list
$ docker run -v /Users/ogawakiyoshi/n4910:/Users/ogawakiyoshi/n4910 -it kaizenjapan/n4910 /bin/bash
C++N4741, 2018 Standard Working Draft on ISO/IEC 14882 sample code compile list
C++N4606, 2016符号断片編纂一覧(example code compile list)
C++N4606, 2016 Working Draft 2016, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/
C++N3242, 2011 sample code compile list on clang++ and g++
読書感想文
CコンパイラによるC言語規格の読書感想文として掲載しています。
コンパイル実験が、C++N4910に対する、G++とClang++による感想文だということご理解いただけると幸いです。
読書感想文は人間かAIだけが作るものとは限りません。
本(電子書籍を含む)を入力として、その内容に対する文字列を読書感想文として受け止めましょう。
元の文章をあり方、コンパイルできるように電子化しておくこと、コンパイラが解釈可能な断片の作り方など。
個人開発
Cコンパイラの試験を一人でもくもくとやっているのは個人開発の一つの姿です。
<この項は書きかけです。順次追記します。>
編纂器(Compiler)
clang++ --version
20220826 以前
Debian clang version 14.0.5-++20220610033153+c12386ae247c-1~exp1~20220610153237.151
Target: x86_64-pc-linux-gnu, Thread model: posix, InstalledDir: /usr/bin
20220827 以降
Debian clang version 14.0.6-++20220622053050+f28c006a5895-1~exp1~20220622173135.152
Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/bin
g++- --version
g++ (GCC) 12.1.0 Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
33.8 Semaphore [thread.sema] C++N4910:2022 (714) p1734.cpp
算譜(source code)
// C++N4910 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/n4910.pdf
const char * n4910 = "33.8 Semaphore [thread.sema] C++N4910:2022 (714) p1734.cpp";
// Debian clang version 14.0.5-++20220610033153+c12386ae247c-
// g++ (GCC) 12.1.0 Copyright (C) 2022 Free Software Foundation, Inc.
// Edited by Dr. OGAWA Kiyoshi. Compile procedure and results record.
// C++N4910:2022 Standard Working Draft on ISO/IEC 14882(0) sample code compile list
// https://qiita.com/kaizen_nagoya/items/fc957ddddd402004bb91
#include "N4910.h"
using namespace std;
// 33.8.1 General [thread.sema.general]
// Semaphores are lightweight synchronization primitives used to constrain concurrent access to a shared resource. They are widely used to implement other synchronization primitives and, whenever both are applicable, can be more efficient than condition variables.
// A counting semaphore is a semaphore object that models a non-negative resource count. A binary semaphore is a semaphore object that has only two states. A binary semaphore should be more efficient than the default implementation of a counting semaphore with a unit resource count.
// 33.8.2 Header <semaphore> synopsis [semaphore.syn]
namespace std {
// 33.8.3, class template counting_semaphore
template<ptrdiff_t least_max_value = implementation-defined>
class counting_semaphore;
using binary_semaphore = counting_semaphore<1>;
}
// 33.8.3 Class template counting_semaphore [thread.sema.cnt]
namespace std {
template<ptrdiff_t least_max_value = implementation-defined> class counting_semaphore {
public:
static constexpr ptrdiff_t max() noexcept;
constexpr explicit counting_semaphore(ptrdiff_t desired);
~counting_semaphore();
counting_semaphore(const counting_semaphore&) = delete;
counting_semaphore& operator=(const counting_semaphore&) = delete;
void release(ptrdiff_t update = 1);
void acquire();
bool try_acquire() noexcept;
template<class Rep, class Period>
bool try_acquire_for(const chrono::duration<Rep, Period>& rel_time);
template<class Clock, class Duration>
bool try_acquire_until(const chrono::time_point<Clock, Duration>& abs_time);
private:
ptrdiff_t counter; // exposition only
};
}
// Class template counting_semaphore maintains an internal counter that is initialized when the semaphore is created. The counter is decremented when a thread acquires the semaphore, and is incremented when a thread releases the semaphore. If a thread tries to acquire the semaphore when the counter is zero, the thread will block until another thread increments the counter by releasing the semaphore.
// least_max_value shall be non-negative; otherwise the program is ill-formed.
// Concurrent invocations of the member functions of counting_semaphore, other than its destructor, do not introduce data races.
static constexpr ptrdiff_t max() noexcept;
// Returns: The maximum value of counter. This value is greater than or equal to least_max_value.
constexpr explicit counting_semaphore(ptrdiff_t desired);
// Preconditions: desired >= 0 is true, and desired <= max() is true.
// Effects: Initializes counter with desired.
// Throws: Nothing.
void release(ptrdiff_t update = 1);
// Preconditions: update >= 0 is true, and update <= max() - counter is true.
// Effects: Atomically execute counter += update. Then, unblocks any threads that are waiting for counter to be greater than zero.
// Synchronization: Strongly happens before invocations of try_acquire that observe the result of the effects.
// Throws: system_error when an exception is required (33.2.2).
// Error conditions: Any of the error conditions allowed for mutex types (33.6.4.2).
bool try_acquire() noexcept;
// Effects: Attempts to atomically decrement counter if it is positive, without blocking. If counter is not decremented, there is no effect and try_acquire immediately returns. An implementation may fail to decrement counter even if it is positive.
// [Note 1: This spurious failure is normally uncommon, but allows interesting implementations based on a simple compare and exchange (33.5).
// An implementation should ensure that try_acquire does not consistently return false in the absence of contending semaphore operations.
// Returns: true if counter was decremented, otherwise false.
void acquire();
// Effects: Repeatedly performs the following steps, in order: — Evaluates try_acquire. If the result is true, returns. — Blocks on *this until counter is greater than zero.
// Throws: system_error when an exception is required (33.2.2).
Error conditions:
Any of the error conditions allowed for mutex types (33.6.4.2).
template<class Rep, class Period>
bool try_acquire_for(const chrono::duration<Rep, Period>& rel_time);
template<class Clock, class Duration>
bool try_acquire_until(const chrono::time_point<Clock, Duration>& abs_time);
// Effects: Repeatedly performs the following steps, in order:
// — Evaluates try_acquire(). If the result is true, returns true.
// — Blocks on *this until counter is greater than zero or until the timeout expires. If it is unblocked by the timeout expiring, returns false.
// The timeout expires (33.2.4) when the current time is after abs_time (for try_acquire_until) or when at least rel_time has passed from the start of the function (for try_acquire_for).
// Throws: Timeout-related exceptions (33.2.4), or system_error when a non-timeout-related exception is required (33.2.2).
// Error conditions: Any of the error conditions allowed for mutex types (33.6.4.2).
int main() {
cout << n4910 << endl;
return EXIT_SUCCESS;
}
編纂・実行結果(compile and go)
$ clang++ p1734.cpp -std=03 -o p1734l -I. -Wall
In file included from p1734.cpp:10:
In file included from ./N4910.h:11:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/atomic:38:
/usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/c++0x_warning.h:32:2: error: This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support \
^
p1734.cpp:20:38: error: use of undeclared identifier 'implementation'
template<ptrdiff_t least_max_value = implementation-defined>
^
p1734.cpp:20:53: error: use of undeclared identifier 'defined'
template<ptrdiff_t least_max_value = implementation-defined>
^
p1734.cpp:22:30: warning: alias declarations are a C++11 extension [-Wc++11-extensions]
using binary_semaphore = counting_semaphore<1>;
^
p1734.cpp:26:38: error: use of undeclared identifier 'implementation'
template<ptrdiff_t least_max_value = implementation-defined> class counting_semaphore {
^
p1734.cpp:26:53: error: use of undeclared identifier 'defined'
template<ptrdiff_t least_max_value = implementation-defined> class counting_semaphore {
^
p1734.cpp:28:14: error: unknown type name 'constexpr'
static constexpr ptrdiff_t max() noexcept;
^
p1734.cpp:28:33: error: expected ';' at end of declaration list
static constexpr ptrdiff_t max() noexcept;
^
;
p1734.cpp:29:7: error: unknown type name 'constexpr'
constexpr explicit counting_semaphore(ptrdiff_t desired);
^
p1734.cpp:29:45: error: unknown type name 'ptrdiff_t'
constexpr explicit counting_semaphore(ptrdiff_t desired);
^
p1734.cpp:29:26: error: constructor cannot have a return type
constexpr explicit counting_semaphore(ptrdiff_t desired);
^~~~~~~~~~~~~~~~~~
p1734.cpp:31:49: warning: deleted function definitions are a C++11 extension [-Wc++11-extensions]
counting_semaphore(const counting_semaphore&) = delete;
^
p1734.cpp:32:66: warning: deleted function definitions are a C++11 extension [-Wc++11-extensions]
counting_semaphore& operator=(const counting_semaphore&) = delete;
^
p1734.cpp:33:20: error: unknown type name 'ptrdiff_t'
void release(ptrdiff_t update = 1);
^
p1734.cpp:35:25: error: expected ';' at end of declaration list
bool try_acquire() noexcept;
^
;
p1734.cpp:37:36: error: use of undeclared identifier 'chrono'
bool try_acquire_for(const chrono::duration<Rep, Period>& rel_time);
^
p1734.cpp:39:41: error: use of undeclared identifier 'chrono'
bool try_acquire_until(const chrono::time_point<Clock, Duration>& abs_time);
^
p1734.cpp:41:1: error: unknown type name 'ptrdiff_t'
ptrdiff_t counter; // exposition only
^
p1734.cpp:46:14: error: unknown type name 'constexpr'
static constexpr ptrdiff_t max() noexcept;
^
p1734.cpp:46:33: error: expected ';' after top level declarator
static constexpr ptrdiff_t max() noexcept;
^
;
p1734.cpp:48:1: error: unknown type name 'constexpr'
constexpr explicit counting_semaphore(ptrdiff_t desired);
^
p1734.cpp:58:20: error: expected function body after function declarator
bool try_acquire() noexcept;
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
3 warnings and 20 errors generated.
$ clang++ p1734.cpp -std=2b -o p1734l -I. -Wall
p1734.cpp:20:38: error: use of undeclared identifier 'implementation'
template<ptrdiff_t least_max_value = implementation-defined>
^
p1734.cpp:20:53: error: use of undeclared identifier 'defined'
template<ptrdiff_t least_max_value = implementation-defined>
^
p1734.cpp:26:38: error: use of undeclared identifier 'implementation'
template<ptrdiff_t least_max_value = implementation-defined> class counting_semaphore {
^
p1734.cpp:26:53: error: use of undeclared identifier 'defined'
template<ptrdiff_t least_max_value = implementation-defined> class counting_semaphore {
^
p1734.cpp:37:36: error: use of undeclared identifier 'chrono'
bool try_acquire_for(const chrono::duration<Rep, Period>& rel_time);
^
p1734.cpp:39:41: error: use of undeclared identifier 'chrono'
bool try_acquire_until(const chrono::time_point<Clock, Duration>& abs_time);
^
p1734.cpp:48:20: error: deduction guide must be declared in the same scope as template 'std::counting_semaphore'
constexpr explicit counting_semaphore(ptrdiff_t desired);
^
p1734.cpp:26:68: note: template is declared here
template<ptrdiff_t least_max_value = implementation-defined> class counting_semaphore {
^
p1734.cpp:48:20: error: deduction guide cannot be declared 'constexpr'
constexpr explicit counting_semaphore(ptrdiff_t desired);
~~~~~~~~~ ^
p1734.cpp:48:20: error: deduction guide declaration without trailing return type
p1734.cpp:66:1: error: unknown type name 'Error'
Error conditions: Any of the error conditions allowed for mutex types (33.6.4.2).
^
p1734.cpp:66:17: error: expected ';' after top level declarator
Error conditions: Any of the error conditions allowed for mutex types (33.6.4.2).
^
;
p1734.cpp:66:19: error: unknown type name 'Any'; did you mean 'any'?
Error conditions: Any of the error conditions allowed for mutex types (33.6.4.2).
^~~
any
/usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/any:77:9: note: 'any' declared here
class any
^
p1734.cpp:66:25: error: expected ';' after top level declarator
Error conditions: Any of the error conditions allowed for mutex types (33.6.4.2).
^
;
p1734.cpp:70:32: error: use of undeclared identifier 'chrono'
bool try_acquire_until(const chrono::time_point<Clock, Duration>& abs_time);
^
14 errors generated.
$ g++ p1734.cpp -std=03 -o p1734g -I. -Wall
In file included from /usr/local/include/c++/12.1.0/atomic:38,
from N4910.h:11,
from p1734.cpp:10:
/usr/local/include/c++/12.1.0/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
32 | #error This file requires compiler and library support \
| ^~~~~
p1734.cpp:28:14: warning: identifier 'constexpr' is a keyword in C++11 [-Wc++11-compat]
28 | static constexpr ptrdiff_t max() noexcept;
| ^~~~~~~~~
p1734.cpp:28:40: warning: identifier 'noexcept' is a keyword in C++11 [-Wc++11-compat]
28 | static constexpr ptrdiff_t max() noexcept;
| ^~~~~~~~
p1734.cpp:66:72: error: too many decimal points in number
66 | Error conditions: Any of the error conditions allowed for mutex types (33.6.4.2).
| ^~~~~~~~
p1734.cpp:20:38: error: 'implementation' was not declared in this scope
20 | template<ptrdiff_t least_max_value = implementation-defined>
| ^~~~~~~~~~~~~~
p1734.cpp:20:53: error: 'defined' was not declared in this scope
20 | template<ptrdiff_t least_max_value = implementation-defined>
| ^~~~~~~
p1734.cpp:22:11: error: expected nested-name-specifier before 'binary_semaphore'
22 | using binary_semaphore = counting_semaphore<1>;
| ^~~~~~~~~~~~~~~~
p1734.cpp:26:38: error: 'implementation' was not declared in this scope
26 | template<ptrdiff_t least_max_value = implementation-defined> class counting_semaphore {
| ^~~~~~~~~~~~~~
p1734.cpp:26:53: error: 'defined' was not declared in this scope
26 | template<ptrdiff_t least_max_value = implementation-defined> class counting_semaphore {
| ^~~~~~~
p1734.cpp:26:53: error: redefinition of default argument for 'long int least_max_value'
p1734.cpp:20:53: note: original definition appeared here
20 | template<ptrdiff_t least_max_value = implementation-defined>
| ^~~~~~~
p1734.cpp:46:14: error: 'constexpr' does not name a type
46 | static constexpr ptrdiff_t max() noexcept;
| ^~~~~~~~~
p1734.cpp:46:14: note: C++11 'constexpr' only available with '-std=c++11' or '-std=gnu++11'
p1734.cpp:48:1: error: 'constexpr' does not name a type
48 | constexpr explicit counting_semaphore(ptrdiff_t desired);
| ^~~~~~~~~
p1734.cpp:48:1: note: C++11 'constexpr' only available with '-std=c++11' or '-std=gnu++11'
p1734.cpp:58:20: error: expected initializer before 'noexcept'
58 | bool try_acquire() noexcept;
| ^~~~~~~~
p1734.cpp:66:1: error: 'Error' does not name a type
66 | Error conditions: Any of the error conditions allowed for mutex types (33.6.4.2).
| ^~~~~
p1734.cpp:70:32: error: 'chrono' does not name a type
70 | bool try_acquire_until(const chrono::time_point<Clock, Duration>& abs_time);
| ^~~~~~
p1734.cpp:70:50: error: expected unqualified-id before '<' token
70 | bool try_acquire_until(const chrono::time_point<Clock, Duration>& abs_time);
| ^
p1734.cpp:70:50: error: expected ')' before '<' token
70 | bool try_acquire_until(const chrono::time_point<Clock, Duration>& abs_time);
| ~ ^
| )
p1734.cpp:70:50: error: expected initializer before '<' token
$ g++ p1734.cpp -std=2b -o p1734g -I. -Wall
p1734.cpp:66:72: error: too many decimal points in number
66 | Error conditions: Any of the error conditions allowed for mutex types (33.6.4.2).
| ^~~~~~~~
p1734.cpp:20:38: error: 'implementation' was not declared in this scope
20 | template<ptrdiff_t least_max_value = implementation-defined>
| ^~~~~~~~~~~~~~
p1734.cpp:20:53: error: 'defined' was not declared in this scope
20 | template<ptrdiff_t least_max_value = implementation-defined>
| ^~~~~~~
p1734.cpp:26:38: error: 'implementation' was not declared in this scope
26 | template<ptrdiff_t least_max_value = implementation-defined> class counting_semaphore {
| ^~~~~~~~~~~~~~
p1734.cpp:26:53: error: 'defined' was not declared in this scope
26 | template<ptrdiff_t least_max_value = implementation-defined> class counting_semaphore {
| ^~~~~~~
p1734.cpp:26:53: error: redefinition of default argument for 'long int least_max_value'
p1734.cpp:20:53: note: original definition appeared here
20 | template<ptrdiff_t least_max_value = implementation-defined>
| ^~~~~~~
p1734.cpp:48:1: error: 'decl-specifier' in declaration of deduction guide
48 | constexpr explicit counting_semaphore(ptrdiff_t desired);
| ^~~~~~~~~
p1734.cpp:48:20: error: deduction guide for 'std::counting_semaphore<least_max_value>' must have trailing return type
48 | constexpr explicit counting_semaphore(ptrdiff_t desired);
| ^~~~~~~~~~~~~~~~~~
p1734.cpp:21:13: note: 'template<long int least_max_value> class std::counting_semaphore' declared here
21 | class counting_semaphore;
| ^~~~~~~~~~~~~~~~~~
p1734.cpp:66:1: error: 'Error' does not name a type; did you mean 'error_t'?
66 | Error conditions: Any of the error conditions allowed for mutex types (33.6.4.2).
| ^~~~~
| error_t
p1734.cpp:70:32: error: 'chrono' does not name a type
70 | bool try_acquire_until(const chrono::time_point<Clock, Duration>& abs_time);
| ^~~~~~
p1734.cpp:70:50: error: expected unqualified-id before '<' token
70 | bool try_acquire_until(const chrono::time_point<Clock, Duration>& abs_time);
| ^
p1734.cpp:70:50: error: expected ')' before '<' token
70 | bool try_acquire_until(const chrono::time_point<Clock, Duration>& abs_time);
| ~ ^
| )
p1734.cpp:70:50: error: expected initializer before '<' token
p1734.cpp:46:34: warning: 'constexpr ptrdiff_t max() noexcept' declared 'static' but never defined [-Wunused-function]
46 | static constexpr ptrdiff_t max() noexcept;
| ^~~
検討事項(agenda)
コンパイルエラーを取るか、コンパイルエラーの理由を解説する。
応用例1 AUTOSAR C++
AUTOSARでC++のコーディング標準を作っている。
MISRA-C++コーディング標準の改訂をまたずに、C++14に対応したかったためかもしれない。
Autosar Guidelines C++14 example code compile list
MISRA C++, AUTOSAR C++について
応用例2 MISRA C/C++
MISRA C まとめ #include
MISRA C++ 5-0-16
応用例3 CERT C/C++
SEI CERT C++ Coding Standard AA. Bibliography 確認中。
MISRA C/C++, AUTOSAR C++, CERT C/C++とC/C++工業標準をコンパイルする
応用例4 箱庭
箱庭もくもく会
第11回 未定
箱庭ではUnityをはじめC++を使っているらしい。
ここでコンパイルしたコードと同じようなコードを使っているか、
ここで出たコンパイルエラーと同じようなエラーがでたかを
いろいろな版のコンパイラでコンパイルして確認していく。
この項目は、箱庭プロジェクトを市場分析の対象として、原則的には、箱庭プロジェクトの外部から分析し、外部から箱庭の広告宣伝のための戦略会議を仮想した結果、仮想「箱庭もくもく会」を開催してみることを企画するものである。
一切の内容は、箱庭プロジェクト、Athrill, TOPPERSとは無関係である。
一(いち)参加データアナリストの、個人的なつぶやきです。
仮想戦略会議「箱庭」
お盆には「箱庭」記事を書きましょう「もくもく会」の題材になる(1)
お盆には「箱庭」記事を書きましょう「もくもく会」の題材になる(2)
自己参考資料(self reference)
関連する自己参照以外は、こちらの先頭に移転。
C言語(C++)に対する誤解、曲解、無理解、爽快。
#include "N4910.h"
C++N4910資料の改善点
dockerにclang
docker gnu(gcc/g++) and llvm(clang/clang++)
コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
C++N4910:2022 tag follower 300人超えました。ありがとうございます。
astyle 使ってみた
<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。>
文書履歴(document history)
ver. 0.01 初稿 20221008