はじめに 本記事は電子書籍版もあります。 linuxカーネルはC言語のマクロを駆使して書かれています。それらのうち、凝ったマクロになじみの無い人には初見では意図がわからない&わかってみれば面白いであろうものをいくつか紹介いたします。対象読者は、C言語のユーザだけれども、マクロは定数定義くらいにしか使わないというライトなマクロユーザです。 マクロを使用する場所に依存するエラーを防ぐ 次のマクロは、二つの引き数の値を置換するだけの単純なものです。
![linuxカーネルで学ぶC言語のマクロ - Qiita](https://cdn-ak-scissors.b.st-hatena.com/image/square/b041778fecb776e7529f1bc02ae55cc389e04712/height=288;version=1;width=512/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Fogp-background-1150d8b18a7c15795b701a55ae908f94.png%3Fixlib%3Drb-1.2.2%26w%3D1200%26mark%3Dhttps%253A%252F%252Fqiita-user-contents.imgix.net%252F~text%253Fixlib%253Drb-1.2.2%2526w%253D840%2526h%253D380%2526txt%253Dlinux%2525E3%252582%2525AB%2525E3%252583%2525BC%2525E3%252583%25258D%2525E3%252583%2525AB%2525E3%252581%2525A7%2525E5%2525AD%2525A6%2525E3%252581%2525B6C%2525E8%2525A8%252580%2525E8%2525AA%25259E%2525E3%252581%2525AE%2525E3%252583%25259E%2525E3%252582%2525AF%2525E3%252583%2525AD%2526txt-color%253D%252523333%2526txt-font%253DAvenir-Black%2526txt-size%253D54%2526txt-clip%253Dellipsis%2526txt-align%253Dcenter%25252Cmiddle%2526s%253D5d55eb82a88c61cf6feec0d4c6c52c2a%26mark-align%3Dcenter%252Cmiddle%26blend%3Dhttps%253A%252F%252Fqiita-user-contents.imgix.net%252F~text%253Fixlib%253Drb-1.2.2%2526w%253D840%2526h%253D500%2526txt%253D%252540satoru_takeuchi%2526txt-color%253D%252523333%2526txt-font%253DAvenir-Black%2526txt-size%253D45%2526txt-align%253Dright%25252Cbottom%2526s%253D4d7b9e0858a67385a93b62706bc78045%26blend-align%3Dcenter%252Cmiddle%26blend-mode%3Dnormal%26s%3Dd41532d8278049be507faa22cdf33110)
Overview¶ {fmt} is an open-source formatting library providing a fast and safe alternative to C stdio and C++ iostreams. Thanks for creating this library. It’s been a hole in C++ for a long time. I’ve used both boost::format and loki::SPrintf, and neither felt like the right answer. This does. Format API¶ The format API is similar in spirit to the C printf family of function but is safer, simpler
言ってしまえば、高階関数は便利だねという話でもあるわけです、それに加えてC++特有の事情があるだけで。 C++視点からのRuby紹介 // Speaker Deckの52ページ目の「ブロックを使ったRAIIっぽい機能」より。 ブロックを使ったRAIIっぽい機能 File.openメソッドファイルを開いた後、受け取ったブロックを実行例外の発生有無にかかわらず最後にファイルを閉じるスコープを抜けると自答的にリソースが閉じられるRAIIと共通しているこのような書き方はC++でも有用です。なぜなら、C++には事実上「デストラクタで例外を投げてはいけない」ためです(cf. More Effective C++ 項目11 デストラクタで発生した例外を抑える)。 そこで、ブロック引数のように関数(オブジェクト)を実引数に取る関数という方法です。後処理に失敗する可能性のある処理を抽象化する方法として有力な
#include <algorithm> #include <iterator> #include <tuple> template < typename Iterator, // RandomAccessIterator typename... Ts, typename U = typename std::iterator_traits<Iterator>::value_type> void sort_by(Iterator begin, Iterator end, Ts U::*... pm) { static_assert(0 < sizeof...(Ts), "empty sort key"); std::sort(begin, end, [&pm...](const U& x, const U& y){ return std::tie(x.*pm...) < std::tie(y
11/05(土)は「Boost.勉強会 #6 札幌」でした。 私を含む数名は前日入りして札幌観光や前夜祭に参加してたりしました。 私は「Boost.Geometryに学ぶテンプレートライブラリの設計」というタイトルで発表してきました。 Learning Template Library Design using Boost.Geomtry View more presentations from Akira Takahashi Conceptで設計されたライブラリは他のライブラリと組み合わせて使うことまで想定して設計されていますが、そういった設計になっていることを知らないと組み合わせて使えないので、Boost.Geometryがどういう設計になっているのか、それはどうやって作られているのかを話し、他にどんなライブラリがConceptで設計されているのかを紹介しました。 その他の発表でとくに
単一要素の波カッコ初期化(braced init list)を、(代入構文ではなく)直接autoで受けた場合のルールが、以下のように変更になります: auto a {1}; // C++14まではinitializer_list<int> // C++1zではint auto b {1, 2}; // C++14まではinitializer_list<int> // C++1zではコンパイルエラー auto c = {1}; // これまで通りinitializer_list<int> auto d = {1, 2}; // これもinitializer_list<int> 参照 N3922 New Rules for auto deduction from braced-init-list お断り この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリ
CやC++で書かれたプログラムをMakeを使ってビルドする、というのはUnix/Linuxではよく行われていることだが、ちゃんとしたMakefileを書くのは意外と難しい。 例えば以下の3つのファイルからなるプログラムを考える。 foo.h: 関数fooの宣言がある。 foo.c: 関数fooの実装がある。 main.c: 関数fooを呼び出す。 /* foo.h */ void foo(int a); /* foo.c */ #include "foo.h" #include <stdio.h> void foo(int a){ printf("%d\n", a); } /* main.c */ #include "foo.h" int main(int argc, char **argv){ foo(10); return 0; } Makefileは例えば以下のように書ける。 PRO
最近のC++標準ライブラリとBoostのちょっとした流行りな気がしますが、タグディスパッチのタグをユーザーに明示的に指定させることで、関数オーバーロードを容易にする方法がいくつかの場所でとられています。 たとえば、Boost.Containerのvectorには、以下のコンストラクタがあります。 // タグの定義 struct default_init_t {}; constexpr default_init_t default_init {}; // vectorのコンストラクタ vector::vector(size_type, default_init_t); // 3要素の配列を用意し、各要素の値を未初期化状態にする vector<T> v(3, default_init); この場合、単に3という1引数を渡すだけだと値初期化したリサイズ操作になりますが、default_initと
C++11で追加されたメンバ関数への参照修飾(ref-qualifier)の使い道についてメモ。 メンバ変数からのムーブ メンバ変数へのアクセサ関数を定義する場合、(1)非const参照を返す非constオーバーロード関数と、(2)const参照を返すconstオーバーロード関数を提供するのが一般的である。下記コードのように、関数f()が返す一時オブジェクト(=rvalue; 右辺値)のアクセサ関数を呼び出す場合も、非constオーバーロード関数(1)が選択されstd::stringはコピーされる。 なお、std::move関数などで明示的に右辺値へ変換すれば、std::stringをムーブすること自体は実現可能。 struct X { // (1)非const版はメンバ変数への非const参照を返す std::string& get() { return m_; } // (2)cons
C++コミュニティ最大の祭典CPPCON 2015が2015-09-21(Mon)から開催されています。基調講演"Writing Good C++14"でBejarne StroustrupがModern C++と呼ばれるC++11以降の標準で良いコードを書くためのガイドライ ン"C++ Core Guidelines"を発表しました。またガイドラインをサポートするための小さなヘッダ・オンリー・ ライブラリ"Guidelines Support Library"をMicrosoftが公開しました。 今回は、C++ Core Guidelinesの概要とGuidelines Support Libraryを利用したコードがどのようになるのか 簡単に説明したいと思います。 C++ Core Guidelinesは抽象度の高いPhilosophyや、より具体的なClass/Functionsの設
Googleがクライアントアプリケーション構築のためのライブラリおよびツール集「Ion」をオープンソースで公開した。 Ionはクロスプラットフォームアプリケーション開発のためのライブラリおよびツールを提供するもので、小さく高速で堅牢な点が特徴だという。Google内でさまざまなチームが利用しており、Google製品を通じて数十億台のデバイス上で動いているという。 バイナリサイズは500kB以下で、スレッド化やランタイム設定編集、メモリアロケーション、オブジェクトライフタイム管理、高速なグラフィックエンジンなどの機能を持つ。また、グラフィックス関連機能としてはグラフィックシーンを分析してパフォーマンスのボトルネックを検出する機能や、OpenGLコールの追跡機能などを備える。実行時のグラフィック状態の検査機能もあり、実行時にシェーダー設定を変更してリアルタイムに結果を確認することもできるという
テンプレートを書いていて、推論された型を確認したい テンプレートを記述していると 「この引数を与えたときには、Tがどう推論されるのか?」 なんて思うことは良くありますよね? 嗚呼、そんなとき、どーしたらよいのでしょーか? たとえば template < typename T > void f(T&&){} void g(int const&){}; int main(){ f(g); } この場合のTがどう推論されるのか知りたい! と思ったとき、どうしますか? 諦める IDEに頼る typeid.name()を使う Boost.Typeindexを使う Attributeを使う(C++14) IDEに頼る フォーカスすると情報が表示されるのを利用する IDEを使っている場合は概ねこれで事足りる typeid.name()を使う ヘッダをインクルードして この方法では実行時までわからない型情
※ @tomerun さんに書いてもらったコードとその検証結果を記事の最後に追記しました.(2013-07-21 2:00) ふとしたきっかけで非復元抽出 (random sampling without replacement) を実装するときに気になったのでどんな実装がよいのか考えてみた.なお非復元抽出はビンゴのように,N個の要素の中からk個の異なる要素をランダムに選択するという意味である. 復元抽出については @unnonouno さんのブログなどに書いてあり,非復元抽出についてもリンクが張ってあったのだけれど,リンク先のブログ記事が読めない状態になっていていたのが残念. unnonouno: 高速な復元抽出の直感的な説明 はじめに std::vector
-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Werror -Wno-unused project(detox) cmake_minimum_r
C++標準ライブラリ<random>で提供される分布生成器(distribution)は、具体的なアルゴリズムまで規定しないため処理系毎に異なる乱数列が得られる。乱数生成エンジン(engine)のアルゴリズム/パラメータが言語仕様で定義されるのとは対照的(→id:yohhoy:20130719)。 #include <random> std::mt19937 rng; // engine std::normal_distribution<> dist; // distribution // rng()で生成される値は全処理系で同一 // dist(rng)で生成される値は処理系依存 複数の処理系間で同一乱数列を得る必要があるときは、Boost.Randomライブラリなどを利用すること。正直、C++標準でポータブルな分布生成器まで提供した方が良かったのでは… 2016-02-25追記:Boo
C++ (on Sea) Online February 7-9 ISO C++ committee meeting March 18-23, Tokyo, Japan ACCU 2024 April 17-20, Bristol, UK using std::cpp 2024 April 25-26, Leganes, Spain C++ Now 2024 May 7-12, Aspen, CO, USA ISO C++ committee meeting June 24-29, St. Louis, MO, USA C++ on Sea July 2-5, Folkestone, Kent, UK The current ISO C++ standard is officially known as ISO International Standard ISO/IEC 14882:20
はじめに 整数型の取り扱い (表現可能な値の範囲を超える "整数オーバーフロー" を防ぐなど) は、セキュリティ上の問題を避けるために、そうでなくとも予期しないバグを避けるために (頻繁に!) 注意しなければならないことだと言えるでしょう。 整数オーバーフローは、特に C/C++ においては深刻な脆弱性の原因になりがちです。昨年界隈を騒がせた Android の Stagefright としてくくられている複数の脆弱性のうち大部分は、この整数オーバーフローが原因となっています。 ただ、C++ における整数型は、実に奇妙です。その奇妙さの結果、C++ において整数オーバーフローを防ぐことは非常に難しいことが……あまり知られていません。というわけで、数回に分けて C++ における整数型 (特に符号付き整数型) の仕様とその奇妙なところ、何故整数オーバーフローチェックが難しいのか、それでもどうや
はじめに C++では通常、クラスのprivateメンバに外部からアクセスすることができない。 アクセスするためには、friend関数やfriendクラスを用いる。 しかし、 http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html で話題となり、Daveが、 https://gist.github.com/1528856 にエッセンスを抽出したコードを起こしているが、privateメンバに外部から合法的にアクセスする方法がある。 Daveのコードのコメントだけで必要十分かもしれないが、私は理解するのにかなり時間がかかってしまったので、その経緯を忘れないためにもここに書いておきたいと思う。 メンバポインタの復習 まずは、このコードを見て欲しい。 http://ideone.com/dGRqg
結論 C++では、一時オブジェクトのメンバ変数の参照を、ポインタ変数とか参照変数に代入してはダメ。 とくに範囲for文の範囲表現は、参照変数に代入してからループを回す扱いになるので注意。 バグコード #include <iostream> #include <vector> // vectorのラッパークラス template<typename T> class Foo { std::vector<T> data_; public: Foo(const std::vector<T>& data) : data_(data) {} // コピーのコストを嫌ってconst参照で返すゲッター const std::vector<T>& data() const { return data_; } }; // テンプレート引数を省略するためのファクトリ template<typename T> F
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く