gcc
プログラミング言語Cの次期仕様C2yでは、複素数型(_Complex float/double/long double)に対するインクリメント/デクリメントが正式サポートされる。gcc/Clangでは独自拡張としてサポート済み。 _Complex double c = 41.; ++c; // OK: C2y assert(c == 42.);…
GCCコンパイラの -pedantic オプションについてメモ。 pedantic 形容詞 〈侮蔑的〉〔文法・学問的なことなどについて〕重要でない事にこだわり過ぎる、学者ぶった、知識をひけらかす、衒学的な https://eow.alc.co.jp/search?q=pedantic GCC 2.95.3マニュア…
メンバ変数を1個ももたない空(empty)の構造体は、C++言語ではwell-definedとされるが、C言語ではill-formedとなる。 // C++: OK / C: NG struct S { }; GCCでは独自拡張として空の構造体を許容するが、標準C++とは異なり構造体サイズが0となることに注意。 /…
C++標準ライブラリの直和データ型std::variant<...>と組み合わせて空の状態を表すstd::monostateオブジェクトでは、std::hashによるハッシュ計算がサポートされる。*1各C++処理系で算出されるハッシュ値の一覧(括弧内は併記コメント/定数名): GCC: -7777…
プログラミング言語Cの次期C2x(C23)言語仕様では、空のブレース{}を用いた配列・構造体の初期化が許容される。C++では当初からOK。 typedef struct S { int m1, m2; } S; // C17:ill-formed / C2x:OK / C++:OK int arr0[10] = {}; S obj0 = {}; // C:OK / C+…
プログラミング言語Cの次期仕様C2x(C23)では、式から型情報を取り出す typeof演算子(typeof operator) が追加される。 // C2x const int x = /*...*/; typeof(x) y; // const int型 typeof_unqual(x) z; // int型 int func(int); typeof(func)* pf; // int(*…
プログラミング言語Cの次期C2x(C23)言語仕様に追加される属性(→id:yohhoy:20200505)reproducible, unsequencedに関するメモ。関数呼び出しに対する最適化ヒント。 // C2x int calc(int x, int y) [[unsequenced]]; int a = /*...*/; int b = calc(a) * 2; …
GCCとClangの独自拡張 returns_twice 属性についてメモ。対象関数から「2回以上制御が戻ってくる可能性」*1をコンパイラに伝える属性。コンパイラによる一部の最適化処理を抑止する。 The returns_twice attribute tells the compiler that a function may r…
gcc(g++) 12.1にて、inline関数に対して暗黙に constexpr 指定を行うコンパイルオプション -fimplicit-constexpr が導入された。同オプションはC++14/17/20言語仕様に対する独自拡張として機能する。 With each successive C++ standard the restrictions on…
C++標準ライブラリで定義されるグローバルオブジェクトstd::cout等の宣言と定義についてメモ。GCC/libstdc++およびClang/libcxxライブラリ実装では、宣言型(std::ostream)と実体定義の型(char[])を意図的に変えている。型の不一致は厳密にはC++仕様違反*1だ…
C++20現在の言語仕様では、ラムダ式に対して(普通のプログラマが期待するであろう)属性指定は行えない。C++2b(C++23)に向けた提案(PDF)P2173R0が進行中。 2022-02-17追記:2022年2月会合にてC++2b(C++23)へ提案文書(PDF)P2173R1が採択された。下記コードは…
C++20 requires式(requires-expression) において、コンセプトや条件式を用いた制約(constraints)表現には注意が必要。 2022-05-08追記:gcc(g++) 12.1から警告 -Wmissing-requires が追加され、本記事で言及しているrequiresキーワード指定忘れの可能性を検…
C++2a(C++20)標準ライブラリ<numbers>では、変数テンプレート(variable template)*1により浮動小数点型(float, double, long double)にあわせた数学定数を提供する。一方、浮動小数点型以外によるプライマリテンプレート利用はill-formedとなることが要請されている。</numbers>…
C++においてコンストラクタ/デストラクタからの仮想関数呼び出しそれ自体はwell-definedだが、おそらくC++プログラマの期待する振る舞いではない。バグの温床になりえるため、大抵のコーディング規約で禁止している(はず)。かつてClangに本件を検知する警…
C言語の可変引数リストアクセス用 va_arg マクロにおける奇妙な制限事項についてメモ。va_argマクロの第二引数へ指定する型名には、“関数ポインタ型” や “配列へのポインタ型” を直接記述できない。ただしtypedefによる別名であればOK。こんなコード書くやつ…
C++17標準ライブラリには「型が異なる変数間での値交換(swap)」可能か否かを判定するメタ関数std::is_(nothrow_)swappable_with<T, U>が存在する。一般的には値交換操作は同一型変数間(swap(T&, T&))で行われるが、プロキシ型(proxy)のような特殊ケースにおいて異</t,>…
プログラミング言語C++において、“default指定でdeletedされるムーブコンストラクタ/代入演算子(→id:yohhoy:20130203)” はオーバーロード解決に影響しない。これはCWG DR 1402で修正された挙動。 struct X { const int i = 42; // constデータメンバを含…
C++1z(C++17)で追加される fallthrough属性 の利用に関する注意点について。下記コードの★部ではフォールスルー(fallthrough)明示を意図しているが、C++コンパイラはプログラマの期待通り振舞わない。これは末尾セミコロン(;)を忘れたことで、fallthrough属…
プログラミング言語C++において、関数からの return 文と暗黙のムーブと型変換の関係についてメモ。*1下記コードfunc_implicit_move関数のように return 文にて型変換(unique_ptr→shared_ptr)を伴う場合、C++11/14言語仕様によって振る舞いが異なる。この…
POSIX環境にて提供されるreaddir, readdir_r関数に関するメモ。まとめ: 事実上スレッドセーフが保証されるreaddir関数を使うこと。将来のPOSIX規格でスレッドセーフ保証が追加予定。 readdir_r関数を利用してはならない。POSIXからも廃止予定であり、GLIBC …
C標準ライブラリscanf関数の書式指定%sにおいて、取得先の文字列バッファを動的確保する機能拡張。 // POSIX準拠システム char *s = NULL; scanf("%ms", &s); // sはmallocで確保される ... free(s); まとめ: 標準C(ISO C):該当機能は存在しない。メモリ領…
gcc(g++)5以降では、C言語スタイルの可変引数リスト(...)に非PODクラス型(≒普通のC++クラス型)を渡すことができる。注意:この振る舞いはgcc 5以降という特定の処理系でのみ合法であり*1、またC++の型システムを無視するため、強い理由がない限りは利用し…
警告:C/C++言語においてはローカル変数*1はその変数スコープ内(関数やブロック)でのみ有効であり、同変数へのポインタ値をスコープ外に持ち出すと未定義動作(undefined behavior)を引き起こす。本記事の内容は未定義動作に依存しているため、実行環境のOS…
オンラインでC++名前デマングル結果を確認できるWebサービス。gcc(g++), Microsoft Visual C++(MSVC)に対応。 https://demangler.com/ GCC and MSVC C++ Demangler https://d.fuqu.jp/c++filtjs/ c++filtjs 関連URL Is there an online name demangler for C…
C/C++言語における文字列リテラル(string literal)最大長に対する最低保証について。C言語では文字列長さに関する制約が存在する。*1要約: C90:509文字までは言語仕様にて保証。それ以上は環境限界に従う。 509 = 512バイト − CRLF改行(2) − NUL終端(1) C9…
gcc(g++)では、C++関数への noexcept 指定子付け忘れを警告するオプションが提供される。Clangでは未実装。要約: 評価結果がfalseとなる noexcept 式オペランドのみが警告対象。残念ながら非常に限定的。 地味にペナルティを受ける「ムーブコンストラクタ/…
gcc(g++)が出力する不思議なエラーメッセージについて。役に立たない昔話。本記事の内容はStack Overflowで見つけた質問と回答に基づく。下記コードはC++言語仕様には違反(ill-formed)しているが、gcc/-fpermissiveオプションでコンパイル可能。 struct B { …
2020-08-13追記:C++17で言語仕様が調整され、constexpr関数であってもnoexceptは特別扱いされなくなった。詳細は c++ - `noexcept` behavior of `constexpr` functions - Stack Overflow 参照のこと。定数式(constant expression)中で呼び出すconstexpr関数…
gcc(g++) 4.9.0以降/gnu++1zモードでは、関数パラメータ型として auto キーワードを利用できる。これはC++1zに向けて提案されているConcepts Lite拡張の一部。2019-01-11追記:C++2a(C++20)言語仕様に向けて、abbreviated function template 構文を含むP114…
C++11以降では、ユーザ定義変換演算子(user-defined conversion operator)の戻り値型をconst Tよりも非constなTとしたほうが良い。関数オーバーロードで引数型const T&およびT&&を受ける関数*1へ渡す際に、同関数呼び出し時のオーバーロード解決失敗によるコ…