yohhoyの日記

技術的メモをしていきたい日記

2026-01-01から1年間の記事一覧

メタ関数と変数テンプレートの非互換性

C++言語における定数値を返すメタ関数X<T>::valueとその変数テンプレート版X_v<T>の微妙な非互換性について。下記コードにおいて、[B]からインスタンス化される変数テンプレート定義の初期化子(initializer)は “immediate context” ではないため、パラメータ置換後</t></t>…

#fatalディレクティブ for C2y

C2y

プログラミング言語Cの次期仕様C2yに向けて、ビルドプロセス*1を即時停止させるプリプロセッサディレクティブ#fatalの提案(PDF)N3960が提出されている。ソースコードの重要な前提条件に違反するケースで(例:未対応のアーキテクチャなど)、後続ソースコー…

ビットマスク型アノテーション

次期標準C++2d(C++29)に向けて、ビットマスク列挙型を実装するアノテーション(annotation)が提案されている。*1列挙型定義に[[=std::bitmask_type]]アノテーションを指定するだけで、ビット操作|(OR), &(AND), ^(XOR), ~(NOT)演算子オーバーロードが自動的に…

識別子の有効文字数 in 標準C

C

プログラミング言語Cの言語仕様における識別子(Identifiers)の有効文字数(significant initial characters)の変遷についてメモ。言語仕様によって識別子の同値比較で利用される「有効文字数の最小長」が規定される。別の表現では「有効文字数の最小長」を超…

std::function_refプライマリテンプレート宣言

C++2c(C++26)標準ライブラリstd::function_ref<R(ArgsTypes...)>クラステンプレートでは、先行宣言のみプライマリテンプレートが可変長引数テンプレート(variadic templates)となっている。技術的には単一のテンプレートパラメータで十分だが、将来拡張のために可変長テンプレ</r(argstypes...)>…

memccpy関数 in 標準C

C23標準ライブラリで追加されたmemccpy関数*1についてメモ。POSIX関数からの標準C入り。コピー元s2からコピー先s1に対して、文字cの初回出現まで、もしくは最大n文字までコピーする関数。標準ヘッダ<string.h>にて宣言される。 void *memccpy(void * restrict s1, cons</string.h>…

ゼロ幅ビットフィールド

C C++

プログラミング言語C/C++では、ビット幅が値0の無名(unnamed)ビットフィールドを宣言できる。ゼロ幅ビットフィールドにより、その前後ビットフィールドへの割当バイト(byte)を分離する。 struct S { int b1 : 4; int b2 : 2; int : 0; // (無名)ゼロ幅ビット…

Case Ranges構文 in 標準C

プログラミング言語Cの次期標準C2yでは、swich構文のcaseラベルにおける数値範囲指定をサポートする。GNU C拡張の標準化。 // C2y switch (n) { case 1 ... 3: // 値1,2,3の処理 break; case 4 ... 6: // 値4,5,6の処理 break; } 2個の定数式(constant-expre…

OBJC_BOOL_IS_BOOLマクロ

Objective-Cランタイムで定義される風変わりな名前のマクロ。 Macro OBJC_BOOL_IS_BOOL iOS | iPadOS | Mac Catalyst | macOS | tvOS | visionOS | watchOS #define OBJC_BOOL_IS_BOOL OBJC_BOOL_IS_BOOL | Apple Developer Documentation Objective-C BOOL…

C/C++ char型のビット幅定義

C23/C++23現在のプログラミング言語仕様では、char型のビット幅CHAR_BITは8bit以上の処理系定義(implementation-defined)と規定される。POSIX規格では厳密にCHAR_BIT==8と定義する。 POSIX IEEE Std 1003.1, 2004, limits.hヘッダ仕様より一部引用。 Numeri…

-fassume-nothrow-exception-dtorオプション

LLVM/Clangでは「C++例外オブジェクトのデストラクタで例外送出しないと仮定する」コンパイルオプション-fassume-nothrow-exception-dtorが提供される。こんな邪悪な例外クラスを扱うユースケースは無いだろうが、C++言語仕様上は禁止されていない。 // デス…

冗長なtypenameキーワード

C++

プログラミング言語C++において型(type)名を記述するとき、C++11以降では修飾名(qualified name)に限って冗長なtypenameキーワードを記述しても良い。 #include <cstddef> using std::size_t; struct S { using type = int; }; typename int x0; // NG typename size_</cstddef>…

型パックからのインデクス指定

プログラミング言語C++において、テンプレートパラメータパック(template parameter pack)からインデクス指定で型(type)を選択する方法。C++2c(C++26)以降では直接的な記述が可能となる。 #include <tuple> // C++11 template <std::size_t Idx, typename... Ts> using Selector = typename std::tupl</std::size_t></tuple>…

unitbufマニピュレータ

C++

C++標準ライブラリのI/Oストリームにおける知名度の低いマニピュレータ(manipulator)。*1出力ストリームに対して出力操作毎のフラッシュ(flush)を指示する。*2 #include <iostream> int x = 42; std::cout << std::unitbuf; std::cout << "x=" << x << "\n"; // operat</iostream>…

"obsolescent feature" in 標準C

C

プログラミング言語C標準規格に登場する「廃止予定の機能(obsolescent feature)」の意味を正確に規定する提案が提出されている。 Motivation Mixing the terms "obsolete", "obsolescent", "deprecated", and "removed", despite distinctions in their mean…

fflush(NULL);

C

C標準ライブラリ関数fflushにヌルポインタを指定すると、プログラムが現在開いている全てのストリームをフラッシュする。 fflush(NULL); // OK C99 7.19.5.2/p1-3より引用(下線部は強調)。 #include <stdio.h> int fflush(FILE *stream); 2 If stream points to an </stdio.h>…

_Exit/_exitはストリームをフラッシュしない

C標準ライブラリ_Exit関数およびPOSIX準拠_exit関数は、プログラムを異常終了させるC標準abort関数と同様に開いているストリーム(FILE型)をフラッシュしない*1。ログファイルや標準出力(stdout)への出力欠落に注意。一方で、C標準ライブラリexit関数ではス…