C
プログラミング言語Cにおける配列添字演算子(array subscript operator)[]の伝統的かつ奇妙な言語仕様に関して、次期C2yをターゲットとした仕様修正が提案されている。小ネタ以外の使い道もなく修正されて良い頃合いかもね?*1 const char msg[] = "Hello"; …
プログラミング言語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マニュア…
プログラミング言語Cの次期仕様C2yに向けて、式の評価順序を厳格に規定する提案 N3203 Strict order of expression evaluation が提出されている。チャレンジングなお話。C言語(C++も同様)では歴史的経緯から、演算子オペランドの評価順*1や関数実引数リス…
プログラミング言語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>…
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となることに注意。 /…
POSIX Pthreadsライブラリのpthread_exit関数とメインスレッドとの関係について。本記事の内容はStackOverflowで見つけた質問と回答に基づく。まとめ: exit関数で終了:他のスレッドが実行中であってもプロセス終了する。 注:main関数からのreturnはexit関…
プログラミング言語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)言語仕様に追加される#embedディレクティブについて。外部ファイルをバイナリデータとしてプログラムに埋込む機能。下記コードは、外部PNGファイル内容を生成プログラム中のuint8_t型配列として埋め込む例*1 *2。C17現在は…
プログラミング言語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; …
プログラミング言語Cの次期仕様C2x(C23)にて、ついにC言語にも真のヌルポインタ定数nullptrがやってくる。 C++11(→id:yohhoy:20120503)から遅れること12年。 int *p1 = nullptr; // C2x以降 int *p2 = NULL; int *p3 = 0; まとめ: C/C++両言語のnullptrが…
プログラミング言語C標準規格における改行文字(new-line character)と改行コードCR, LFとの関係性について。まとめ: C標準規格ではプログラム内部で扱う「改行文字」と、外部ファイルにおける具体的なCR, LF等の「文字コード」を区別する。*1 *2 改行文字を…
GCCとClangの独自拡張 returns_twice 属性についてメモ。対象関数から「2回以上制御が戻ってくる可能性」*1をコンパイラに伝える属性。コンパイラによる一部の最適化処理を抑止する。 The returns_twice attribute tells the compiler that a function may r…
プログラミング言語Cの次期C2x(C23)標準ライブラリprintf関数ファミリでは、変換指定子bによる2進数フォーマット出力がサポートされる。同時にscanf関数ファミリやstrtoT関数では0bプレフィクス付き文字列入力がサポートされる。*1 // C2x #include <stdio.h> printf(</stdio.h>…
C標準ライブラリrealloc関数に対して、サイズ0を指定すべきでない。realloc(ptr, 0)によってptrが指すメモリブロックが解放(free(ptr)相当)される保証はない。この動作は ISO C および POSIX それぞれで明言されている。JPCERT MEM04-C サイズ0のメモリ割…
プログラミング言語C/C++のそれぞれ次期バージョンC2x(C23)/C++2b(C++23)では、新しいプリプロセッサディレクティブ#elifdefと#elifndefが追加される予定。*1 #ifdef identifier:#if defined(identifier)と等価 #ifndef identifier:#if !defined(identifie…
タイトル通り。ISO/IEC JTC1/SC22/WG14サイト各種文書への短縮リンク提供サービス。 2024-01-04追記:ドメイン失効(?)によるリンク切れを確認。 wg14.link/nXXXX Get document.wg14.link/{c99,c11,c18,c2x} Get latest working draft. 関連URL WG21 redirec…
プログラミング言語Cの次期仕様C2x(C23)では 2進数リテラル(binary literal) が正式仕様となる。そこ今更とか言わない。 // C2x unsigned x = 0b101010; unsigned y = 0B11110000; ノート:2003年時点の (PDF) Rationale for International Standard Program…
C++標準ライブラリに含まれるC標準ライブラリヘッダ*1と、std名前空間との関係についてメモ。C++11以降では、下記の振る舞いが保証される: ヘッダcxxx: 名前空間stdにCライブラリの識別子が宣言される。グローバル名前空間にも宣言されるかもしれない。 ヘ…
C標準ライブラリ Muslのatoi関数実装 では、符号付き整数オーバーフロー回避のため負数範囲で10進数値を減算してゆき最後に符号反転を行っている。 int atoi(const char *s) { int n=0, neg=0; while (isspace(*s)) s++; switch (*s) { case '-': neg=1; cas…
プログラミング言語Cの次期仕様C2x(C23)では 属性(attribute) 構文が標準化される。属性構文を先行導入したC++言語とほぼ等価であり、連続するブラケット[[/]]を用いる。*1 // C2x [[nodiscard]] int f(); void g([[maybe_unsed]] int a) { [[maybe_unused]…
初期のLinuxカーネル(Version 0.12)ソースコード詳細解説と図解を試みる電子書籍。1109ページの超大作。 http://www.oldlinux.org/ (PDF) "A Heavily Commented Linux Kernel Source Code," Zhao Jiong
Clangコンパイラはユーザ定義のコンパイル警告/エラーメッセージ出力を行うdiagnose_if属性を提供する。 The diagnose_if attribute can be placed on function declarations to emit warnings or errors at compile-time if calls to the attributed funct…
最新C17までカバーした、モダンなC言語プログラミングに関する電子書籍。PDF形式(315頁)はCC BY-NC-ND 4.0ライセンス。 https://modernc.gforge.inria.fr/ , Jens Gustedt https://gustedt.wordpress.com/2019/09/18/modern-c-second-edition/
C言語の可変引数リストアクセス用 va_arg マクロにおける奇妙な制限事項についてメモ。va_argマクロの第二引数へ指定する型名には、“関数ポインタ型” や “配列へのポインタ型” を直接記述できない。ただしtypedefによる別名であればOK。こんなコード書くやつ…
プログラミング言語C/C++における浮動小数点数 NaN(Not-a-Number)*1 について。C/C++標準ライブラリはquiet NaN*2を返すnan関数を提供し、同関数では処理系定義(implementation-defined)のタグ文字列を受け取る。一般的には空文字列""を指定するが、ライブラ…
CUDAメモリ転送系関数の Async サフィックス有無*1と、実際の同期(synchronous)/非同期(asynchronous)動作は1:1対応しない。Asyncサフィックス無しメモリ転送関数でも、条件によっては非同期動作となる可能性がある。 API synchronization behavior The API…
プログラミング言語C/C++のトークン(記号・キーワード・識別子名など)出現頻度を調査したデータセット。約1.1万のOSSパッケージ/256万行のソースコードから5032万個のトークンを抽出。 (PDF) Andrew’s C/C++ Token Count Dataset 2016 (ACTCD16) http://w…