yohhoyの日記

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

2012-11-01から1ヶ月間の記事一覧

無名(匿名)名前空間の不思議な定義

プログラミング言語C++における無名名前空間(unnamed namespace)*1の、一見すると不思議な(実は根拠がある)定義に関するメモ。本記事はStack Overflow上での質問と回答内容に基づく。 C++言語仕様での定義 C++03 7.3.1.1/p1では、unnamed namespaceの振る…

引数プレースホルダの衝突回避

C++11標準ライブラリとBoost.Bindライブラリが提供する、関数バインダ用の引数プレースホルダ(placeholders)に関するメモ。C++標準ライブラリとBoost.Bindライブラリを(暗黙的に*1)併用する場合、_1や_2などの引数プレースホルダ名が衝突するケースがある…

main関数のreturn省略

C C++

プログラミング言語C/C++において、main関数のreturn文を省略した場合の振る舞いに関するメモ。まとめ: C99より前では、戻り値が未定義(undefined)とされる。*1 C99以降では省略可能。「return 0;」として扱う。 C++では省略可能。「return 0;」として扱う。…

typeid演算子と参照型/cv修飾

プログラミング言語C++の typeid 演算子における、参照型および cv修飾(const, volatile)の扱いについてメモ。typeid演算子オペランドに型名(type-id)を指定する場合、下記ルールが適用されることに注意。 対象が参照型(T&, T&&)の場合、参照先の型Tとして…

条件演算子と左辺値の扱いの差

C C++

プログラミング言語C/C++における条件演算子(?:)と左辺値の扱いについてメモ。言語仕様の隅をつつく話題であり、通常はif文を利用するべき。下記コードはCでは未定義動作(undefined behavior)を引き起こすが、C++ではwell-definedであり期待通り動作する(変…

'main' is usually a function

gcc

gccの一風変わった警告メッセージ。下記コードはfalse(1)相当を実装する。 unsigned main = 3275800627u; // xor %eax, %eax ; 0x33 0xc0 // inc %eax ; 0x40 // ret ; 0xc3 // 0xc340c033 = 3275800627 gcc 4.6.3@x86環境の実行結果*1: $ gcc -Wall input…

ラムダ式のcapture-defaultとthisポインタ

C++

C++ラムダ式のキャプチャ指定において、デフォルトでコピーキャプチャ+thisポインタ[=, this]はNGだが、デフォルトで参照キャプチャ+thisポインタ[&, this]は許容される。*12018-07-03追記:C++2a(C++20)言語仕様としてP0806R2が採択され、[=]による暗黙の…

Javaのconstキーワード

プログラミング言語Javaでは const をキーワードとして予約しているが、Java SE 7現在でも何ら特定の機能を持たない*1。(恐らく将来に渡って現状のままと予測される)1999年時点でJDK 1.2.0に対する機能拡張要求 BugID:4211070 Java should support const p…

長さゼロ on 文字列/メモリ操作関数

C

標準Cライブラリヘッダ string.h, wchar.h で提供される文字列/メモリ操作関数に対し、長さ 0 を指定した時の振る舞いについて。操作対象とする文字列/メモリの “長さ” をとる関数において、該当引数に0を指定したときの振る舞いは下記の通り規定される。 …

bool型へのexplicitユーザ定義変換

C++

C++11からはユーザ定義変換に対してexplicit指定ができ、意図しない暗黙の型変換を抑止できるようになった。一方で「bool型へのexplicitユーザ定義変換」だけは、記述されている場所に応じて(コンテキストに依存して)自動的にbool型へと変換される。 class…

書籍"The Boost C++ Libraries"

書籍"The Boost C++ Libraries"の旧Edition全文がWeb公開されている。同内容はBoostライブラリ 1.42.0に基づく。Creative Commons BY-NC-NDライセンス。2014-11-01追記:Boostライブラリ 1.56.0まで対応したアップデートが行われている。 The Boost C++ Libr…

C++でCPS

C++

C++11からはラムダ式が導入され、CPS(Continuation Passing Style; 継続渡しスタイル)で簡単に記述できるようになった(と思う)。実用性の程はともかく。 #include <functional> #include <iostream> // 階乗計算 int fact(int n) { if (n == 0) return 1; else return n * fact(n</iostream></functional>…

overrideキーワード指定の強制?

C++

C++11で新しく導入されたoverrideキーワード*1に関するメモ。コーディング時のミスや設計変更により「意図せず正しいオーバーライドになっていない*2」事態を防ぐ仕組みだが、C++11にはこのoverrideキーワード利用自体を強制する機能はない。overrideキーワ…

_MSC_FULL_VERマクロ

Microsoft Visual C++コンパイラのバージョン判定マクロについて。2017-03-07追記:本ページはVC2012以降メンテナンスされていない。最新版はyumetodoさんによる _MSC_VERと_MSC_FULLVERをまとめる を参照のこと。メジャー/マイナーバージョンを判定するため…

イベントのnullチェック回避

C#

イベントに予め “空の匿名メソッド” を登録しておくことで、イベント呼び出し時にnullチェックを逐一記述する必要がなくなる。Null Objectパターン*1。 public delegate void SomeHandler(object sender, SomeEventArgs e); public event SomeHandler SomeEv…

タグ付きタプル型

C++

C++標準ライブラリやBoost.Tupleライブラリが提供するタプル型(tuple)では、タプル要素へはインデクス指定でアクセスする。タプルの要素アクセスを名前(タグ)経由で行う方法についてメモ。(機能的には普通の “構造体(struct)” に相当。) #include <tuple> std::tu</tuple>…

文字列型のnull/空文字列判定

プログラミング言語JavaやC#では文字列型=参照型として定義されるため、空の文字列""と参照先なしnullは明確に区別される。一方で処理ロジックの “有効な文字列を保持しているか?” 確認のために、文字列型の変数に対して「nullまたは空文字列判定」が多用…