yohhoyの日記

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

C

新着順 人気順

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

C

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

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…

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…

"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関数ではス…

bit_castマクロ for C言語

C

プログラミング言語Cにおいて、ビット表現を維持したまま型変換を安全に行うマクロ。C++標準ライブラリのstd::bit_cast<To>(from)相当。本記事の内容はStackOverflowで見つけた質問と回答に基づく。 // C99 : 右辺値に未対応 #define bit_cast(T, ...) \ (*((T*)</to>…

式static_assert in C言語

C C2y

プログラミング言語Cにおいて、式(expression)として扱えるコンパイル時アサートの実装例(C11以降)。*1 *22026-02-15追記:次期標準C2y向けに提案文書(PDF)N3715が採択され、関数形式マクロでの利便性向上を目的としてstatic_assert(cexp[, msg])構文を式(…

配列要素数の取得 in 標準C

C C2y

プログラミング言語Cの次期標準C2yでは、配列要素数を安全に取得する_Countof演算子が導入される。オペランドに配列型を要求すること以外は、構文規則的にsizeof演算子とほぼ同じ。 // C2y int fibs[] = { 1, 1, 2, 3, 5, 8, 13, 21 }; static_assert(_Count…

名前付きループ in 標準C

C C2y

プログラミング言語Cの次期標準C2yでは、名前付きループ(Named Loop)構文としてbreak/continue文へのラベル指定がサポートされる。 // C2y outer: for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { break; // 内部ループ脱出: 1)へ break oute…

8進数リテラルプレフィクス in 標準C

プログラミング言語Cの次期標準C2yでは、8進数リテラルプレフィクス0o/0Oが導入される。 // C2y int n1 = 0o52; // 42 int n2 = 0O52; // 42 int n0 = 052; // 42 (従来記法; 廃止予定) 0o/0Oプレフィクス追加と同時に、数値0のみプレフィクスとする従来8…

i += 1 + ++i; の処理結果(C/C++編)

C C++

異なるプログラミング言語における式i += 1 + ++i処理結果の違いについてメモ。警告:1つの式内で同一変数を複数回更新する技巧的なコード記述は避けてください。DO NOT WRITE THIS ON PRODUCTION CODE. sequenced-before関係ルールを覚えてまで際どいコード…

16進文字から数値への変換: ch - 'a' + 10

C C2y

プログラミング言語Cの次期仕様C2yでは、16進数表記で用いられるアルファベット文字範囲'a'~'f'および'A'~'F'について文字コードの連続性保証が明文化される。この文字コード範囲での連続性保証は、ラテンアルファベット26文字 A~Z / a~z が連続配置され…

配列添字演算子の小さな改善案 for C2y

C C2y

プログラミング言語Cにおける配列添字演算子(array subscript operator)[]の伝統的かつ奇妙な言語仕様に関して、次期C2yをターゲットとした仕様修正が提案されている。小ネタ以外の使い道もなく修正されて良い頃合いかもね?*12026-08-29追記:2025年8月会合…

インクリメント on 複素数

プログラミング言語Cの次期仕様C2yでは、複素数型(_Complex float/double/long double)に対するインクリメント/デクリメントが正式サポートされる。gcc/Clangでは独自拡張としてサポート済み。 _Complex double c = 41.; ++c; // OK: C2y assert(c == 42.);…

GCC -pedanticオプション

GCCコンパイラの -pedantic オプションについてメモ。 pedantic 形容詞 〈侮蔑的〉〔文法・学問的なことなどについて〕重要でない事にこだわり過ぎる、学者ぶった、知識をひけらかす、衒学的な https://eow.alc.co.jp/search?q=pedantic GCC 2.95.3マニュア…

NEO assertマクロ

プログラミング言語C/C++の次期標準規格C2x(C23)およびC++2c(C++26)では、アサーションマクロassertの改善が行われる。 #include <assert.h> // C/C++ #include <cassert> // C++のみ int is_valid(int); assert( "42 shall be vaild", is_valid(42) ); // NG: C17/C++20現在 //</cassert></assert.h>…

signal関数プロトタイプ宣言

C C++

C++17以降のC++標準ライブラリ仕様では、signal関数のプロトタイプ宣言が読みやすく書き直されている。 C++17仕様 C++標準ライブラリ仕様としてプロトタイプ宣言が行われている。C++17 21.10.3より宣言を引用: Header <csignal> synopsis namespace std { // 21.10.4</csignal>…

空っぽの構造体

メンバ変数を1個ももたない空(empty)の構造体は、C++言語ではwell-definedとされるが、C言語ではill-formedとなる。 // C++: OK / C: NG struct S { }; GCCでは独自拡張として空の構造体を許容するが、標準C++とは異なり構造体サイズが0となることに注意。 /…

pthread_exit on main thread

POSIX Pthreadsライブラリのpthread_exit関数とメインスレッドとの関係について。本記事の内容はStackOverflowで見つけた質問と回答に基づく。まとめ: exit関数で終了:他のスレッドが実行中であってもプロセス終了する。 注:main関数からのreturnはexit関…

R.I.P. "= {0}"

プログラミング言語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+…

#embedディレクティブ

プログラミング言語Cの次期C2x(C23)言語仕様に追加される#embedディレクティブについて。外部ファイルをバイナリデータとしてプログラムに埋込む機能。2025-02-20追記:プログラミング言語C++においても、次期C++2c(C++26)に同機能を追加する提案文書P1967R1…

typeof演算子 in 標準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(*…

reproducible/unsequenced属性

プログラミング言語Cの次期C2x(C23)言語仕様に追加される属性(→id:yohhoy:20200505)reproducible, unsequencedに関するメモ。関数呼び出しに対する最適化ヒント。 // C2x int calc(int x, int y) [[unsequenced]]; int a = /*...*/; int b = calc(a) * 2; …

nullptr定数 in 標準C

C C2x

プログラミング言語Cの次期仕様C2x(C23)にて、ついにC言語にも真のヌルポインタ定数nullptrがやってくる。 C++11(→id:yohhoy:20120503)から遅れること12年。 int *p1 = nullptr; // C2x以降 int *p2 = NULL; int *p3 = 0; まとめ: C/C++両言語のnullptrが…

改行コード(CR/LF)と改行文字と標準C

C

プログラミング言語C標準規格における改行文字(new-line character)と改行コードCR, LFとの関係性について。まとめ: C標準規格ではプログラム内部で扱う「改行文字」と、外部ファイルにおける具体的なCR, LF等の「文字コード」を区別する。*1 *2 改行文字を…

returns_twice属性

GCCとClangの独自拡張 returns_twice 属性についてメモ。対象関数から「2回以上制御が戻ってくる可能性」*1をコンパイラに伝える属性。コンパイラによる一部の最適化処理を抑止する。 The returns_twice attribute tells the compiler that a function may r…

2進数フォーマット出力 in 標準C

プログラミング言語Cの次期C2x(C23)標準ライブラリprintf関数ファミリでは、変換指定子bによる2進数フォーマット出力がサポートされる。同時にscanf関数ファミリやstrtoT関数では0bプレフィクス付き文字列入力がサポートされる。*1 // C2x #include <stdio.h> printf(</stdio.h>…