Content-Length: 265047 | pFad | http://b.hatena.ne.jp/site/theolizer.com/
サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
iPhone 16e
theolizer.com
こんにちは。GWも本稼働中の田原です。 CMakeはCMakeLists.txtでプロジェクトを定義します。1つのプロジェクトには複数のバイナリを生成(ビルド)するための定義が含まれることが少なくありません。そして、配布用のバイナリ、自動テスト用のバイナリ、インストーラ等など複数のサブ・プロジェクトに分解したくなることもあります。(個人的には半年以上継続するようなプロジェクトは皆これに該当しました。意外に多いです。)今回はそのような場面向けのCMakeコマンドであるadd_subdirectoryについて解説します。 1.CMakeのプロジェクトはフォルダ1つに1つまで CMakeLists.txtのファイル名はこれ1つだけです。他の名前へ変更する方法はないようです。同じ名前のファイルはフォルダ毎に1つまでしか置けませんので、CMakeのプロジェクトとしてもフォルダ毎に最大1つしか置けませ
こんにちは。田原です。 回はMicrosoftのVisual Stduioに含まれるVisual C++の話題です。 Visual C++を使っていてC4996警告に悩まされ時があると思います。その対策について解説します。 1.C4996警告がでる時 例えば、文字列を文字列へ繋げる処理はよくやると思います。 そのようなC言語ソースを下記のように作ってVisual StudioでビルドするとC4996警告が表示されます。(バッファオーバーフローに気を使っているので、ちょっと長いです。) #include <stdio.h> #include <string.h> #include <stdbool.h> int main() { char buff[20]; char const* str="test string"; // 11文字 char const* add=" (added)";
こんにちは。田原です。いよいよ来月から消費増税、頭痛いです。 さて、第8回で軽く触れているのですが、今回は4つの情報提供変数(CMAKE_SOURCE_DIR、CMAKE_BINARY_DIR、CMAKE_CURRENT_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR)について詳しく解説します。これらの変数はソースの位置やビルド先を獲得できるもので少し複雑なプロジェクトを作る時にたいへん便利です。 1.ビルド・システム生成モード これら4つの変数は、主にビルド・システム生成モードで使います。 1-1.ビルド・システム生成モードにおける振る舞い まず、CMAKE_CURRENT_SOURCE_DIRは現在処理している CMakeLists.txt があるフォルダのフルパスです。そして、CMAKE_CURRENT_BINARY_DIRは現在処理している CMakeLis
こんにちは。田原です。 C++は大変多くのプラットフォームで使える高生産性な開発ツールです。しかし、マルチ・プラットフォーム対応のビルド・ツールは多くはないため、C++を使っても意外にマルチ・プラットフォームなプログラムの開発には苦労します。その苦労をかなり軽減してくれるツールがCMakeです。そこで、今回からCMake編としてCMakeの使い方を解説していきたいと思います。 なお、今回は、説明の都合上、以前解説したCMakeの基礎とTheolizerの組み込み方から抽出したので前半はほとんど重複してます。ごめんなさい。 1.CMakeの基本 CMake編のインデックス・ページで基本的な説明をしていますので、もしまだご覧になっていない方は是非ざっと目を通して下さい。 ビルドについて ビルドの基本についてCMakeの基礎とTheolizerの組み込み方の「1.予備知識」にて、私なりに説明して
こんにちは。セオラド テクノロジー代表の田原です。 C++は、高速性と高生産性を兼ね備えた優れた言語です。しかし、高速性を犠牲にしない言語設計のため、学習の難易度が高いです。特に文法面から理解しようとするとハードルが非常に高いと感じます。 しかし、人が自由に定めることができる文法に比べて、実際のプログラミング言語は現実世界の制約を受けます。特にC++はコンピュータを直接制御しますから、現実のコンピュータの仕組みをざっくり把握しておくと難解なC++も理解しやすくなります。 そこで、当講座ではC++が制御するコンピュータの仕組みと関連付けて、C++を使いこなすために必要な基礎知識を解説していきます。これにより、高速なプログラムを高速に(短期間で)開発できることを目標とします。
こんにちは。田原です。 今回は良く使うCMakeコマンドの解説を予定していましたが、予定を変更してスクリプト・モードと並ぶCMakeの難関Multiple Configurelationについて解説したいと思います。CMakeはMakeなどのシングル・コンフィグレーションとVisual Studioなどのマルチ・コンフィグレーションの2種類をサポートしています。この2つも似てて非なるものなのでかなりハマりました。こちらも早目に説明した方が良さそうです。 1.シングル・コンフィグレーションとマルチ・コンフィグレーション ぶっちゃけDebugビルドとReleaseビルドの2つのビルド・モード(*1)をどのようにサポートするのか?という話です。シングル・コンフィグレーションは、ビルド・システム(≒Makefile)を生成する際にDebug・Releaseを指定します。マルチ・コンフィグレーション
実践C++応用講座CMake編 【無料】 ビルド・システム(いわゆる Makefile) C++で実用的なプログラムを開発する時には、効率的にビルドできるようビルド・システム(いわゆる Makefile のことです)を用意することが一般的です。 1つのプロジェクトには多くのソース・ファイルが含まれることが多く、個人で開発する場合でも十数個~数十個程度になることも少なくありません。そのようなプロジェクトでプログラムを修正して走らせる度に全てのソースをコンパイル/リンクしていると時間がかかりすぎて効率が悪いです。 そこで、必要なソースだけをコンパイル/リンクするための仕組みがビルド・システムです。これを使うとデバッグの効率がたいへん上がります。(ですので、事実上必須と言っても過言ではないと思います。) ビルド・ツール問題 しかし、問題があります。ビルド・システムはプロジェクト毎に多くの設定
第37回目 ムーブの使いどころ 2017年9月17日 実践C++入門講座 こんにちは。田原です。 今回は、最後にムーブの使いどころについて解説します。ムーブはC++11前までは無かった機能ですので頻繁に使われるわけではありません。意外に使いどころが難しいです。しかし、実は標準ライブラリで有効に … この記事を読む 第36回目 最後の特殊メンバ関数ムーブ・コンストラクタ 2017年9月10日 実践C++入門講座 こんにちは。田原です。 今回は最後の特殊メンバ関数ムーブ・コンストラクタとその使い方について解説します。また、特殊メンバ関数は常に自動生成されるわけではありません。自動生成されないのはどんな時か、またその理由について説明 … この記事を読む 第35回目 ムーブと右辺値参照と特殊メンバ関数と 2017年9月3日 実践C++入門講座 こんにちは。田原です。 前回、6つの特殊メンバ関数の内
(実際にはこの前後にもう少し履歴がありますし、ビルド・モードによって内容が異なります。詳しくは後述します。) さて、上記プログラムのbar()関数でスタック・トレースを出力することを知っているので意味付けできますが、どこでスタック・トレースを出力したのか知らない時(普通はこちらです)、単なるアドレスのリストを見ても何が何やら分からないですね。 そこで、コード内のアドレスとソースの位置を対応付けるためのデバッグ用シンボルを利用して、上記アドレスをソースへ対応付けることができます。例えば、次のような出力を得られます。 1# bar at c:\cpp-school2\12.stack_trace\stack_trace.cpp:36 2# foo at c:\cpp-school2\12.stack_trace\stack_trace.cpp:42 3# main at c:\cpp-scho
こんにちは。田原です。 前回は明示的実体化について解説しました。今回は明示的特殊化について解説します。ちょっと似た用語ですので混乱しないようにして下さい。「実体化」と「特殊化」の違いです。またC++規格書は「特殊化」という用語をあまり直感的ではない使い方をしています。「明示的特殊化」があれば「暗黙的特殊化」もあると予想する人が多いと思いますがありません。他にも一般的な用法とは異なる使い方をされているため混乱しがちです。その辺りについても解説したいと思います。 1.明示的特殊化 明示的特殊化(Explicit specialization)は、最初に定義したテンプレート(プライマリ・テンプレートと呼びます)について、特定の型について異なる定義をできる仕組みです。 クラス・テンプレートと関数テンプレートのどちらとも、明示的特殊化をすることができます。 1-1.クラス・テンプレートの場合 まず簡
こんにちは。田原です。 前回、前々回とテンプレートは通常は暗黙的に実体化される話をしました。マクロでクラス・テンプレートっぽいことをする場合は「明示的実体化のようなもの」が必要ですが、テンプレートでは省略できます。しかし、明示的に実体化することもできますので、その必要性と使い方について解説します。実際に使うことは少ないですが、テンプレートを理解するために「実体化」についてきちんと把握しておくことは重要です。 1.一般の関数やクラスの場合 1-1.グローバル関数の場合 グローバル関数はヘッダ・ファイルには宣言だけを書き、関数の中身をcppファイルで定義することができます。(普通の書き方ですね。) また、inline関数にすればヘッダ・ファイルで関数の中身を定義することができます。inlineを付けないとインクルードされる度に、その関数のマシン語コードが生成されるため、リンク時に多重定義(mu
こんにちは。田原です。 今回は、最後にムーブの使いどころについて解説します。ムーブはC++11前までは無かった機能ですので頻繁に使われるわけではありません。意外に使いどころが難しいです。しかし、実は標準ライブラリで有効に活用されている縁の下の力持ちです。その仕組を把握しておくとプログラミングの幅が広がります。 1.関数の戻り値の場合 前回、ちょっとだけ触れましたが、関数の戻り値にムーブを使うと性能が上がりそうに感じます。しかし、RVO(Return Value Optimization)やNRVO(Named Return Value Optimization)と呼ばれる最適化手法に任せた方がより性能が上がります。その見極めの話です。 1-1.ムーブといえどもメンバ変数はコピーする まず、ムーブは一切コピーせずに「移動」するものではありません。「移動」という言葉に反するように感じますが、そ
こんにちは。田原です。 C言語の明示的な型変換は1つしかありません。問答無用に変換するので使い方を誤りやすくバグの元になり勝ちです。それに比べC++の明示的な型変換は危険なものが別れているためそれを使わないよう避けておけば比較的安全です。 また、その一つのdynamic_castは遅いと聞くので測ってみたところ、面白い結果が出ましたので報告します。 1.まずは暗黙の型変換 C++は明示的に型を指定して変数や定数の型を変換する場合と、暗黙的(自動的)に変換される場合の2つがあります。まずは暗黙的な変換について簡単に説明します。(詳しい説明は複雑ですので、入門講座では扱いません。) 1-1. いつ暗黙の型変換が発生するのか? 関数に渡される時と演算される時に暗黙の型変換(自動変換)が発生します。 例えば、short x=10; foo(x);のように関数fooへshort型変数xが渡される時や
こんにちは。田原です。 前回、例外の使い方とその便利良さを解説しました。 いつも退屈で憂鬱なエラー処理の記述とテストをかなり削減できる本当にありがたい機構なのですが、使い方が難しいです。その難しい部分(特に避けて通った方が良い部分)や各種の使用上のノウハウを解説します。 1.なるべくcatch(…)で例外を握りつぶさない 前回、catch(…)を最後に書くと、それまでのcatch()で捕まえることができなかった例外を捉えることができるけど、どんな例外かわからない旨、説明しました。 さて、例外はエラー処理の記述とテストを容易にするための仕組みです。 エラーの内容を把握し、自動リカバリを可能とする 例えば、ユーザにファイル名が不適切であることをメッセージ表示し、適切なファイル名を入力して貰うなどが考えられます。ヒューマンエラーが頻発しないことは期待できますし、ヒューマンエラーが発生した時、処理
こんにちは。田原です。 前回まででクラスの基本の重要部分の解説が終わりましたが、あともう少し説明しておくべきことが残ってます。今回はその残りのstaticメンバとクラス宣言の外でメンバを定義する方法などについて解説します。 1.クラスとオブジェクトとインスタンス 今まで、クラス型の変数などと呼んでましたが、クラス型の変数やnewで獲得したクラス実体のことを、インスタンスやオブジェクトと呼ぶことが多いようです。 クラスも含めてオブジェクトと呼ばれることもあります。例えば「オブジェクト指向プログラミング」ですね。 class Foo { int mData; public: Foo() : mData(123) { } }; int main() { Foo mFoo; Foo* pFoo=new Foo(); delete pFoo; } というプログラムがあるとき、mFooはFooクラスの
こんにちは。田原です。 Visual Stduio用のプロジェクトはGUIで1つ1つオプションを設定するので、ひょいっとプロジェクトを作るという訳にはいきません。また、マルチ・プラットフォーム開発はビルドにも意外に苦労します。CMakeはこの両者の問題をかなり高いレベルで解決できます。 ひょいっとVC++用プロジェクトを作れますし、マルチ・プラットフォーム対応プログラムを様々な環境でビルドするプロジェクトをCMakeだけで構築できます。 今回は、CMakeを使うためのビルドに関する予備知識とCMakeを使うメリットとその基本的な使い方を説明し、TheolizerをCMakeプロジェクトに組み込む方法を解説します。 1.予備知識 1-1.ビルド=コンパイル+リンク ビルドと一言でってもその中身は様々な工程の集まりです。 その多数の工程はざっくりコンパイルとリンクに分けることが出来ます。 C+
Theoride Technology Co.,Ltd. Theolizerはセオライド テクノロジーの登録商標です。
C++は高速なプログラムを多くのプラットフォーム向けに高い生産性で開発できることが特長です。 多数のCPUメーカ、OSベンダー、オープン・ソース・プロジェクトから 多種類のコンピュータ用コンパイラとライブラリ(以後、処理系と呼びます)が提供されてます しかも、ワールド・ワイドな標準規格(ISO/IEC)により、多数の実装において比較的高いレベルで仕様が統一されています これらの特長により、多くの基幹的なアプリケーション・ソフトウェアや各種ミドルウェアがC++で開発されています。更に膨大なソフトウェア資産あります。 従って、今後も基幹的なソフトウェアや高速性が要求されるソフトウェアの開発にはC++が使われ続けます。 C++に近い言語として、C++の前身であるC言語があります。C言語も高速なプログラムを多くのプラットフォーム向けにアセンブラよりは高い生産性で開発できます。そして、C++よりも更
こんにちは。田原です。 今回は、前回に引き続き、文字の内部表現について解説します。まず¥マーク問題、次に日本語文字コードについて解説します。文字コードについては本当に奥深いのですが、ここでは各種表示を日本語で出力する程度の「普通」の日本語対応するプログラムを開発する際に知っておくべきこと中心に解説します。 特に昔から日本語対応が進んでいたWindowsは過去幾つかの不幸な決定が重なった結果、頭の痛い問題が複数あります。そして、互換性の維持のためなかなか対策できず、未だに完全解決には程遠い状態です。それらの問題が発生する仕組みと問題を軽減する対策についても一部解説します。 既に経験された方も多いと思いますが、¥マークが \(バックスラッシュ)に化けるように見える問題です。原因は簡単です。¥マークと\(バックスラッシュ)は文字コードが同じ値なのです。どちらとも0x5cなのです。次のようになって
ポインタは型名に*(アスタリスク)を付けたものですので、ポインタ変数は下記のようにして定義します。 型名* 変数名; 例えば、以下のaIntはint型変数へのポインタ、aFooはFoo型変数へのポインタです。 struct Foo { unsigned mData; }; int* aInt; Foo* aFoo; ところで、ポインタの定義方法の流儀はもう一つあります。 int *aInt; です。微妙な差ですが、*がint側ではなくaInt側に付いてます。文法的にはどちらもOKです。 変数を複数同時に定義することを考えると、この方が間違いが少ないと言う流儀です。 例えば、下記のように書くと、aInt0はポインタですが、aInt1はポインタではないint型です。 int* aInt0, aInt1; これを防ぐためには変数名側に*を付けた方が良いですね。 int *aInt0, *aInt
こんにちは。 つい先日、Visual Studio 2017がリリースされましたので、今回は急遽予定を変更して、Visual Studio 2017 Communityによるビルド/デバッグ環境のインストールと設定方法を説明します。 また当講座ではCMakeも使いますので、WindowsへのCMakeのインストール方法も説明します。 手順としては簡単で下記3つです。 ダウンロードする インストールする Visual Studioへサインインする 2.は、インストール・オプションにもよると思いますが、後述の設定の場合、1時間弱程待たされます。その間は他のことをしていても良いですので、ご飯でも食べてTVでも見ながらゆっくり待てる時に始めましょう。 また、サインインしない場合、30日間Visual Studio 2017 Communityを使えますが、その後使えなくなるようです。サインインして
このページを最初にブックマークしてみませんか?
『Theolizer®』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く
Fetched URL: http://b.hatena.ne.jp/site/theolizer.com/
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy