c/c++

C言語やC++のマクロ内で pragma を使う方法

C99導入された _Pragma(...) を使うとマクロ内でも pragma が書けます. _Pragma は C++11 で C++でも使えるようになっています. #include <stdio.h> #define PARALLEL_FOR _Pragma("omp parallel for") int main() { PARALLEL_FOR for (int i=0; i<10; ++i) { print</stdio.h>…

C/C++で文字列を小文字に変換する

C言語またはC++で,文字列を小文字(lower case)に変換する方法です 移植性が高い方法 C99またはC++ならワンライナーで記述できます #include <ctype.h> char str[] = "ABCD"; for (char *p = str ; *p; ++p) *p = tolower(*p); ANSIのtolower関数を使っているので移</ctype.h>…

C/C++でshellのように"~"や環境変数を展開する方法

bashなどの shell では "~/*" "$HOME/*" はホームディレクトリ以下のファイル名に展開されます.これをC/C++で実装する方法です 実装 wordexp(3) を使います #include <wordexp.h> #include <stdio.h> int main(int argc, char *argv[]) { wordexp_t exp; int flags = 0; int ret</stdio.h></wordexp.h>…

3月1日の一日前を計算する方法

いろんな言語・コマンドラインで,日付の足し算・引き算をする方法をまとめます.例として,3月1日の1日前を計算を考えます.この計算は,うるう年があるので面倒です.たとえば 2021年3月1日の前日は 2月28日 2020年3月1日は前日は 2月29日 となりますが…

Linuxカーネルのソースコードを読む(その6: git 経由でカーネルソースを高速に入手する方法)

git経由で Linuxのソースコードを高速に入手する方法です 初回 clone 入手するバージョンは 6.3.1 clone先ディレクトリの名前は linux-stable とすると以下のコマンドでソースコードが入手できます $ git clone --depth 1 --branch v6.3.1 git://git.kernel.…

C言語で glibc のバージョンを確認する方法

C言語で glibc のバージョンを確認する方法をまとめます コンパイル時にバージョンを確認する 以下のマクロを使います __GLIBC__ __GLIBC_MINOR__ バージョンをprintf()で表示する #include <stdio.h> int main(void) { printf("%d.%d\n", __GLIBC__, __GLIBC_MINOR__</stdio.h>…

__FILE__ からディレクトリ名を削除する方法

c/c++のマクロ __FILE__ から、ディレクトリ名を取り除いて、ファイル名だけ(basenameだけ)にする方法です。stackoverflow にいろんな方法が掲載されていたので、要点だけまとめます。 https://stackoverflow.com/questions/8487986/file-macro-shows-full-p…

MSVC でC26812の警告を消す方法

Visual studio (MSVC) 2019で C26812のwarningを無視する方法ですC26812 は enum class に関する警告で、たとえば次のようなメッセージが出力されます。 Prefer ‘enum class’ over ‘enum’ (Enum.3). この警告はC++11で新しく追加された enum class と従来のe…

Linuxカーネルのソースコードを読む(その4: list.h 後編)

Linux カーネルのソースコードを読んだのでメモを公開します.Linuxカーネルを読む際の参考になれば幸いです. お題: list.h 前回の続き,リスト構造の実装です.前回のエントリはこちら http://pyopyopyo.hatenablog.com/entry/2019/06/30/150000 リストの…

Linuxカーネルのソースコードを読む(その3: list.h 前編)

Linux カーネルのソースコードを読んだのでメモを公開します.Linuxカーネルを読む際の参考になれば幸いです.今回のお題: include/linux/list.h 今回はカーネル内部で多用されているデータ構造の一つとして linked list の実装を読みました.主なファイルは …

コンパイラのAddressSanitizerを使ってバッファ オーバーフローを退治する

C言語やC++の欠点の一つは,バッファオーバーフローやオーバーランが起こりやすいことです.それは欠点であると同時にC/C++の利点であると言う人もいます.つまり,メモリ関連のチェックを省略することで,省略した分C/C++はオーバヘッドが少ない高速なプロ…

glibc でバックトレースを表示する方法(その2)

C/C++で関数を書きました.デバッグに超便利なので,まるごと公開します.backtraceを取得して,FILE* に出力します.出力時の書式は format の引数で変更できます.CおよびC++両方に対応しています. C++のシンボル名は,自動で demangle(デマングル)します…

複数の静的ライブラリ (.a) を結合する方法

(2019年11月15日,更新) 改訂版を新しく書きました pyopyopyo.hatenablog.com 2つの static library, libX.a と libY.a を結合して libZ.a を生成するには $ ar cqT libZ.a libX.a libY.a で一旦 thin archive形式の libZ.a を生成し, $ echo "create lib…

ユニークなシンボルを自動生成

デバッグ用のマクロ等で時々必要となる,ユニークなシンボル名(関数名とか変数名)を自動生成するマクロ #define CAT_I(a,b) a##b #define CAT(a,b) CAT_I(a,b) #define UNIQSYM(tag) CAT(tag, __LINE__) 使い方はこんな感じ int UNIQSYM(hogehoge) = 123; こ…

dereferencing type-punned pointer will break strict-aliasing

dereferencing type-punned pointer will break strict-aliasing の警告を回避する方法.C/C++では,以下のようなType-punned pointerを使うコードは,厳密には動作が保証できない. float f = 123; uint32_t u = *(uint32_t*)&f; このようなコードは,例え…

32bit/64bit 両対応な printf の書き方

32bit/64bit両対応のコードを書いていると,よく printf() で引っかかります."%d"のような"書式"がややこしいからです.というわけで,変数の"型"と"書式"の対応を,表で整理してみました. 型 書式 注意事項 ssize_t %zd size_t %zu intmax_t %jd uintmax_…

crcの計算

c++ で CRCを計算するコード.boost の crc.hpp を使います #include <iostream> #include <cassert> #include <boost/crc.hpp> using namespace std; int main() { const char *data = "hello boost/crc.hpp"; const size_t len = sizeof(data); // CRC-CCITT boost::crc_basic<16> crc1( 0x10</boost/crc.hpp></cassert></iostream>…

boost/accumulators

C/C++で、平均値、最大値、最小値、分散、中央値等の統計量を計算するなら、boost::accumulators が便利。2017年6月13日追記.情報が古かったので更新しました #include <iostream> #include <boost/accumulators/accumulators.hpp> #include <boost/accumulators/statistics.hpp> using namespace boost::accumulators; int main() { accumulato</boost/accumulators/statistics.hpp></boost/accumulators/accumulators.hpp></iostream>…

boost/format.hpp

iostream って使いにくい。特に浮動小数点数を使う時は printf系に分がある気がする。たとえば以下のCのコードも #include <stdio.h> int main() { printf("%10d\n", 12345); printf("%10.3f\n", 12.345); printf("%10.6f\n", 12.345); return 0; } std::cout を使う</stdio.h>…

最近のdoxygenはスゴイ

doxygen*1 と言えば、cやc++のソースコードからドキュメントを自動生成する便利なソフトウェアです。この doxygen、ここ1年ぐらいですごく改良されています。ちょうど昨日(2010/6/15)に最新版の 1.7.0 がリリースされたので、この機会に最新版に乗り換えて、…

gcc 4.5.0 リリース

今日明日にも GCC 4.5.0 がリリースされる模様。 ミラーに行き渡ったら、正式にアナウンスされるとのこと。http://gcc.gnu.org/ml/gcc/2010-04/msg00321.htmlすでに http://gcc.gnu.org/ の更新は終わっており、Current release series は、 GCC 4.5.0 とな…

visual c++ で M_PI とか M_LOG2E を使う方法

windows の visual c++ (visual studio)で、M_PI や M_LOG2E のような定数を使う場合は #define _USE_MATH_DEFINES #include <math.h> と、math.h をincludeする前に、_USE_MATH_DEFINES を定義する。参考 http://msdn.microsoft.com/ja-jp/library/4hwaceh6.aspx</math.h>

NANの定義について

gcc環境だと math.h に NAN という定数が定義されている。ところが visual c++ (visual studio)には対応する定義が無い。環境に依存しない、ポータブルな、移植性の高いコードが必要な場合は、STLを使って #include <limits> std::numeric_limits<float>::quiet_NaN(); std:</float></limits>…

Visual C++で、std::min, std::max を使う方法。

visual c++ (Microsoft Visual Studio)では、std::min(), std::max() が使えない場合がある。これは windows.h に昔から定義されている min、 max というマクロがあり、これと名前が衝突するため。回避方法は #define NOMINMAX #include <windows.h> と NOMINMAX を定義</windows.h>…

c/c++で MySQL を使う方法

c/c++ で mysql のデータベースへアクセスする方法をまとめます。rubyやphpと比べるとc/c++でのコーディングはかなり面倒ですが、うまく記述できればパフォーマンスがかなり向上できるようです。参考URL http://dev.mysql.com/doc/refman/5.5/en/c.html c/c+…

boostのインストール方法(windowsの場合)

Windowsに、boostのライブラリとヘッダファイルをインストールする方法です。 ライブラリのビルド 先ず以下の手順で ライブラリをビルドします。 予め Visual studio express edition 等の開発環境をインストールしておく http://www.boost.org/ から最新の…

boostのcondition variable(条件変数)

Linuxだと pthread_cond_wait() つまり POSIX系、 Windows だと WaitForSingleObject() つまり Win32APIと、スレッドまわりのAPIはOSによって使い分ける必要があります。これは面倒くさい!!そういう場合は boost の boost::thread 一派が便利です。たとえば…

GCC 4.4 情報

GCCの次期バージョン 4.4 系ですが、ついに rc1 がリリースされました。そこで実際にGCC 4.4.0-rc1 を試し、変更点・残っているバグなどを調べてみました。なお、オフィシャルなドキュメントは以下のURLにまとめられています。 http://gcc.gnu.org/gcc-4.4/c…

super pi を作ろう

円周率πを100万桁まで計算するプログラムを作ってみました。super pi もどきです。ソースコードと解説を載せます。ソースコードは80行程度の非常に短いものですが、このような簡単な実装でも最近のPCなら100万桁の円周率が一分も掛らず計算できます。 ポイン…

任意精度計算ライブラリ(GMP)の使い方

プログラミング時に注意すべき点の一つに,計算精度の問題があります.たとえばC/C++だと,doubleで計算しても有効桁数は15桁程度(10進数で)しかありません.その結果,以下のような状況で間違った計算結果が出てしまいます. 取り扱う数値が15桁を越える場…