C
メンバ変数を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サイト各種文書への短縮リンク提供サービス。 wg14.link/nXXXX Get document.wg14.link/{c99,c11,c18,c2x} Get latest working draft. https://wg14.link/ 関連URL WG21 redirect service - yohhoyの日記
プログラミング言語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…
C標準ライブラリ提供の擬似乱数生成関数randでは、既定のシード値は 1 と定義される。 #include <stdlib.h> int main() { // 暗黙にsrand(1)相当でシード値を設定 int x = rand(); } C11 7.22.2.2/p2より引用(下線部は強調)。 The srand function uses the argument </stdlib.h>…
C/C++標準ライブラリ提供のアトミック変数atomic<T>, atomic_Tでは、ロックフリー(lock-free)性判定マクロATOMIC_*_LOCK_FREE*1 が3状態 Never/Sometimes/Always を取りうる。C++11策定当時の提案文書N2427によれば、“ロックリーに振る舞う可能性あり”(ATOMI</t>…
volatileキーワードはマルチスレッド処理に役立つ?.com(http://isvolatileusefulwiththreads.com/) C http://c.isvolatileusefulwiththreads.com/ C++ http://cxx.isvolatileusefulwiththreads.com/ Java http://java.isvolatileusefulwiththreads.com/ C…
プログラミング言語C/C++における、配列型とポインタ演算の知られざる*1落とし穴。問題:下記sum_odd関数の実行結果は? int data[5] = { 1, 2, 3, 4, 5 }; // 奇数番目の要素値のみを合計する int sum_odd() { int s = 0; int *endp = data + 5; // 配列末…
C++2a(C++20)で導入予定のDesignated Initialization(指示付きの初期化)ついてメモ。C99での同一言語機能をベースとするが、一部機能制限された形でC++に導入される。 // C++2a(C++20) struct Point { int x, y; }; void f(Point); f({ .x = 100, .y = 50 …
プログラミング言語Cにおいて、構造体/配列型変数宣言の初期化子リスト(initializer-list)*1で要素数が足りない場合の初期値について。 ポインタ型の場合、ヌルポインタ(NULL) で初期化される。*2 算術型の場合、(正値または符号無し)値0 で初期化される…