メモ

メモに全部突っ込んで書いていたら,まさかの「サイズがデカすぎて処理できませんエラー」がサーバから返されてしまった. しょうがないので,C/C++系のトラブルだけこっちに移すことにした.

argcとargv

int main(int argc, char **argv)
  • が一般的な宣言
  • arguments count(argc), arguments value(argv)と覚えよう

sizeof

  • sizeof()の返り値
    OSWindows XPFreeBSD
    コンパイラVS 2008VS 2005.NET 2003VS6gcc(C)gcc(C++)cc(C)cc(C++)
    char1
    unsigned char1
    short2
    int4
    long int4
    float4
    double8

ダイアログをMFCダイアログから呼び出すと反応が異様に遅い.

  • C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700\msvcr80.dll
  • を読み出そうとして遅くなってるっぽ.
  • 何故,読み出すようになったのか・・・それだけが分からないよ.

:未解決?

CTimeを使わずに時間を取得する

  • time.hを使う
    struct tm *timeinfo;
    time_t	timer;
    timer    = time(NULL);
    timeinfo = localtime(&timer);
    strftime(buffer, length, "%m%d-%H%M%S", timeinfo);
  • もっと短い時間(ミリ秒とか)を取得する場合はGetTickCount()とかを使うべし.

floatとdoubleの違いについて

C++のprivateなポインタ変数をreturnで外に出す

  • クラスでprivateで宣言したポインタ変数を,return でクラスの外に出すと,何も問題なく編集出来てしまう.
    1. #include <stdlib.h>
    2. #include <stdio.h>
    3.  
    4. class Hoge{
    5.         public:
    6.                 Hoge(){memory = new int;};
    7.                 ~Hoge(){delete memory;};
    8.         private:
    9.                 int* memory;
    10.         public:
    11.                 int* a(void){return memory;}
    12. };
    13.  
    14. int main(int argc, char **argv){
    15.         Hoge *a = new Hoge();
    16.         int* b;
    17.         b = a->a();  //←ここで問題なくポインタを取得できる
    18.         *b = 5;     //←ここで変更できてしまう
    19.         return 0;
    20. }
  • private変数をreturnする段階でアウトなんじゃね?と思うんだが,コンパイラも実行時エラーも出ない.
  • ポインタが指す番地の中身は変更できるが、ポインタが指す番地自体は変更できない

enumの定義方法

  • いっつも忘れるので自分用のmemo
    enum 型 {値1, 値2, ... 値N };
  • Example
    enum the_sin {PRIDE, GLUTTONY, GREED, SLOTH, WRATH, ENVY, LUST};

実行時にMSVCR80.DLL (MSVCR80D.DLL?) が無いと言われる

  • OpenCVのデバッグ用ライブラリとリンクした後,実行時に言われた.
  • 以下の2点を修正
    • highguid.libを外した
    • highguid.libをビルドしなおし
  • あとcxcored.libをリンクすると,heapがどうの,と文句を言われた.

ジャンル:OpenCV:未解決?

fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。

  • プリコンパイル済みヘッダが定義されてるプロジェクトに自身で作ったファイルを追加するとこうなる
  • MFCのダイアログベースのプロジェクトの場合,stdafx.hなるプリコンパイル済みヘッダーが作られる
  • cppファイル側で,ヘッダファイルをincludeする前に
    #include "stdafx.h"
    #include "xxxx.h"
  • としてやればエラーは回避できる
  • プロジェクトのプロパティで「プリコンパイル済みヘッダを利用しない」と定義するのも1つの手

ジャンル:Visual Studio

fatal error C1020: 予期しない #endif です。

  • "stdafx.h"をインクルードすると,それ以前のプリプロセッサ行は無視されるらしい.
  • よって,下記のようにWindowsの場合はインクルードして,それ以外のOSの場合はしないでと言うコードは失敗する
    #ifdef _WIN32
    #include "stdafx.h"
    #endif
  • この場合はstdafx.hへのincludeは諦め,「プリコンパイル済みヘッダを利用しない」と定義する

ジャンル:Visual Studio

fatal error C1033:

  • おそらくテンポラリなエラー
  • Visual Studioでこれが起きる場合,IntelliSenseの更新とかぶって編集が出来ていない可能性があり.

ジャンル:Visual Studio

error C2062: 型 'char' は不要です。

  • smallと言う変数名は予約語
  • RpcNdr.hを(どういう経緯でincludeしたかは知らないが)includeすると,
    #define small char
  • とされている.
  • と言うわけで,変数名smallを使用するとcharを宣言したことになり,上記のエラーが発生する.
  • レアなエラーかも.

ジャンル:Visual Studio

error C2064: 引数を取り込む関数には評価されません。

  • 変数と関数で同じ名前を使用すると発生する
  • 変数が優先されるらしい.
    time_t time;
    time = time(NULL); //関数のtimeが正しく取り扱われない

ジャンル:Visual Studio

error C2059: 構文エラー : サフィックスが無効です。

  • 変数名の最初に数字を用いるとエラーになる.
 int 3DPoints[200]; // <- 変数名の頭に数字は使えない

ジャンル:Visual Studio

error C2065: 'M_PI' : 定義されていない識別子です。

  • M_PIはmath.hで定義されてる円周率
  • しかし,math.hをincludeしただけではdefineされない
  • _USE_MATH_DEFINESをdefineする必要がある
  • ちなみにVC++6では定義されてないとのうわさ.
 #define _USE_MATH_DEFINES  // <-これが一番大事♪
 #include <math.h>
 int main(){
   printf("%f\n", M_PI);
 }

ジャンル:Visual Studio

error C2381: 'exit' : 再定義 ; __declspec(noreturn) が異なります。

error C2679: 二項演算子 '<<' : 型 'const largeNumber' の右オペランドを扱う演算子が見つかりません (または変換できません)。

  • error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::string' (or there is no acceptable conversion) [duplicate]
  • cppunitを使ってテストをビルドしようとしたら、このエラーが出た。
  • 下記、assertionを使うと、OStringStreamに << 演算子で出力する。
    1. template <class T>
    2. struct assertion_traits
    3. { 
    4.     static bool equal( const T& x, const T& y )
    5.     {
    6.         return x == y;
    7.     }
    8.  
    9.     static std::string toString( const T& x )
    10.     {
    11.         OStringStream ost;
    12.         ost << x;  // error
    13.         return ost.str();
    14.     }
    15. };
  • このOStreingStreamはstd::ostringstream として、Stream.hに定義されている。
  • なので、この operator << を定義する必要がある
  • headerファイル
    std::ostream& operator << (std::ostream& out, const class foo& right);
  • cppファイル
    std::ostream& operator << (std::ostream& out, const class foo& right)
    {
    	out << right.getString();	// 適当な処理を行う
    	return out;
    }
  • 後述するように、ヘッダファイルと実装を切り分けないと、多重定義が発生するので注意。

error C3861: 'min'識別子が見つかりませんでした

  • 'max'も同じく
  • Visual Studio 2005からVisual Studio 2008に変更したら起きた
  • どうやら,min,maxは非標準のマクロだったらしい.
  • std::min, std::maxでリプレースするのが妥当かと.
    std::max(a, b)
  • しかし,それでもダメなときがある.
    error C2780: 'const _Ty &std::max(const _Ty &,const _Ty &,_Pr)' : 3 引数が必要です - 2 が設定されます。
  • 引数にテンプレート関数を使ってる関係で,どうやら,引数の2つが違うtypeだとエラーの模様.
  • 両方の引数の型が違うとこける模様.
    double d = 1.0;
    int i = 0;
    std::max(i, d);  // ←ここでdoubleとintの比較なのでこける
  • ってな具合に.
  • 静的キャストを使って回避しよう
    std::max(1.0, (double)0);

error D8016 : コマンド ライン オプション '/GL' と '/ZI' は同時に指定できません

ジャンル:Visual Studio

warning C4390: プロトタイプされている関数が呼び出されませんでした (変数の定義が意図されていますか?)

  • クラスのコンストラクタが引数が無いのに、空っぽのカッコ付きでコールするとこうなる
    class CHogehoge{
    public:
        CHogehoge() {};
    };
    main(){
        CHogehoge temp(); // ←こいつが警告を引き起こす
        //CHogehoge temp; // 正しくは、カッコ無しで宣言する
    }
  • 参考:コンパイラの警告 (レベル 1) C4930*2

warning C4819:ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。

  • OpenCVをVisual Studio 2005で利用するとこのwarningが出る.
  • cv/cvcompat.h が原因.
  • Visual Studio 2005でcv/compat.hを編集(一文字入力してから消去)してファイルを保存するとwarningが消える.
  • 参考:Visual C++ 2008 Express Edition - OpenCV@Chihara-Lab., 2007-12-07公開, 2012-01-23更新, 2013-03-12閲覧};

ジャンル:OpenCV:OpenCV 1.1:OpenCV 2.0:OpenCV 2.1:Visual Studio

  • Visual Studio 2008 + OpenCV 2.2 ではlegacy/compat.hpp がこのwarningを出す.
  • 上記方法では何故かwarningが消えない.
  • 原因は追求中.
  • 対症療法と根本的な解決方法を1つずつ
  • #pragma を使って warning を 抑制
  1. #pragma warning(disable : 4819)
  2. #include <cv.h>
  3. #pragma warning(default: 4819)
  • 正しいファイルをインクルードする
    • OpenCV 2.2 でファイル構造が大幅に変わった.
    • C++インタフェース用のファイルとCインタフェース用のファイルが別々になってる.
    • 旧来の cv.h や cxcore.h のincludeも compatibility として残されている(build\include\opencv 以下のファイル達)
    • それらをincludeすると,上記C4819 warningが発生する.
    • 対応するヘッダファイルを opnecv2 以下から探してくれば良い
      • cxcore.h <-> opencv2/core/core_c.h (Cインタフェース) opencv2/core/core.hpp (C++インタフェース)
      • cv.h <-> opencv2/imgproc/imgproc_c.h (Cインタフェース) opencv2/imgproc/imgproc.hpp (C++インタフェース)
      • highgui.h <-> opencv2/highgui/highgui_c.h (Cインタフェース) opencv2/highgui/highgui.hpp (C++インタフェース)
      • など(あくまでも一例)
  • いずれにしろwarningなだけなんだが.

ジャンル:OpenCV:OpenCV 2.2:Visual Studio

warning C4800: 'int' : ブール値を 'true' または 'false' に強制的に設定します (警告の処理)

  • 原因:intをboolにキャストしている
    1. bool function(int number){
    2. return (bool)number; // warning C4800
    3. }
  • int型の変数が0だったらfalse,それ以外の場合はtrueとする場合は多々ある.
  • しかし,intをboolにキャストしてはいけない(厳密には非boolの型どんなものでも)(仕様)
  • 対処
  • キャストするときに != 0 を使うのが一番簡単
    1. bool function(int number){
    2. return number != 0;
    3. }
  • cf:コンパイラの警告 (レベル 3) C4800 (C++)

warning LNK4098: defaultlib '*****' は他のライブラリの使用と競合しています。

ジャンル:Visual Studio

warning MSB8012: TargetPath does not match the Library's OutputFile

0xc0150002 アプリケーションを正しく初期化できませんでした

ジャンル:OpenCV:OpenCV 1.1:Visual Studio

OpenCV 1.1でプロセス(プログラム)が終了しなくなる

ジャンル:OpenCV:OpenCV 1.1:Visual Studio:未解決?

関数を使用しただけで,突然大量の「型が定義されていません」エラーが発生する

  • KLTの実装にて起きた.
  • 原因というより,C言語で起きてたので,仕様とも言うべき事態.
  • KLTの本体はC言語で書かれている割に,メインプログラムはC++でコンパイルできる.
  • よって,メインプログラム内の適当な場所で関数をコールすると,それより後で宣言が行われていた場合,宣言が全てエラーになる.
  • 初歩的な・・・

ジャンル:Visual Studio

Visual Studio .NETでプロファイラを使う方法

  • Professional Edition のみ?
  • VC++の場合(多分ほかも同じだと思うけれど)
  1. ビルド(B)→ガイド付き最適化のプロファイル(P)→インストルメント(I)を実行
    • リビルドが行われる
    • Debugモードだとerror D8016が出たので無理かも
  2. ビルド(B)→ガイド付き最適化のプロファイル(P)→インストルメントまたは最適化されたアプリケーションの実行(R)
    • アプリケーションが起動するので,適当に動かす(最適化させたい動作がベスト)
    • アプリケーションを終了する
  3. ビルド(B)→ガイド付き最適化のプロファイル(P)→最適化(O)
    • 実行した情報がカウントして統計される
  4. ツール(T)→Visual Studio 2005 Command Promptを実行
  5. コマンドプロンプト上でコマンドを実行
    C:\Program ... \VC\bin>pgomgr /summary XXXXXX\apli.pgd 
    • XXXXXXにはアプリのReleaseフォルダへのパス
    • apliはソリューションの名前
  6. これでこんな表示が出るはず.長いのでリダイレクト推奨
    Microsoft(R) Profile Guided Optimization Manager 8.00.50727.762
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    PGD ファイル: \XXXXXXXX\apli.pgd  11/20/2008 12:54:52
    モジュールの数: 1  関数の数: 389  Arc の数: 1248  値の数: 18
    
    静的命令: 11054  基本ブロック: 1743  平均 BB サイズ: 6.3
    動的命令: 327756730
    
                                         entry  static       dynamic     %     run
    関数名                               count   instr         instr  total   total
    tSubtractAverage                    307200      93     134351620   41.0   41.0
    shift                              1603470      90      44897160   13.7   54.7
    C2TSI::getInnerProductMap              240     181      35021113   10.7   65.4
    tLowPass                            153600     322      34713600   10.6   76.0
    tPadZero                            307200     122      32070160    9.8   85.8
    CTSI::SearchStartAndEnd                960     118      31556620    9.6   95.4
    CTSI::extractRawColumn              307200      29       8908800    2.7   98.1
    CTSI::getNormMap                       480      58       3699360    1.1   99.2
    CTSI::getTimeSpaceImage               1442     357        977770    0.3   99.5
    _cvGetRow                            40560       9        365040    0.1   99.6
    CTSI::loadImageFromImageFile         20164      23        302460    0.1   99.7
    CTSI::loadImageFromImageFile         20164      11        221804    0.1   99.8
    • 右から3列目のdynamic instrが実行回数
    • 右から2列目の%totalがその関数が実行に要した時間
    • 一番右のrun totalが実行時間の累計和
  7. 次回ビルドするときに何か言われることがあるが,プロファイラをしないなら,リビルドを行ってよい.

ジャンル:Visual Studio

FILE*構造体

int fseek(FILE *fp, long offset, int whence);

  • whenceからoffsetバイト分移動したところに移動する
  • whenceは,
    • ファイルの先頭を表すSEEK_SET
    • 現在位置であるSEEK_CUR
    • 終端位置であるSEEK_END
  • のどれか

void rewind(FILE *fp);

FILE* fopen(const char *filename, const char *mode);

  • filenameとmodeの順番に注意!!

コード要素***が読み取り専用であるため、追加と削除操作は出来ません

  • Visual Studio 2005で発生
  • MFCダイアログボックスにボタンを追加し,イベントハンラを追加しようとしたら発生
  • 原因はncbファイルの破損っぽい.
  • http://blogs.yahoo.co.jp/dpdtp652/837997.html 参照
  • ncbファイルはちなみにintellisenseの情報を保存したファイルっぽい.
  • ソリューションを1度閉じた後,ソリューションと同じフォルダに存在するプロジェクト名.ncbファイルを削除
  • 再びソリューションを開くと問題が解決している

ジャンル:Visual Studio

コード要素***が読み取り専用であるため、追加と削除操作は出来ません VS2010編

  • Visual Studio 2010で発生
  • MFCダイアログボックスにボタンを追加し,イベントハンラを追加しようとしたら発生
  • 原因はインテリセンスの保存されているsdfファイルの模様
  • ソリューションを1度閉じた後,ソリューションと同じフォルダに存在するソリューション名.sdfファイルを削除
  • 再びソリューションを開くと問題が解決している
  • また、だいたいのクラスウィザードのエラーはこれ

ジャンル:Visual Studio

プロジェクトにクラスの追加を行うとVisutal Studioがフリーズする

  • メニューからクラスの追加操作を行うだけでVisual Studioがフリーズする.
  • 原因はコード要素が読み取り専用..と類似
  • ncbファイルを削除すること

ジャンル:Visual Studio

CRとLF

  • CRが\rであり,Mac OS(9まで)などで使われていた改行コード
  • LFが\nであり,Unix系のOSなどで使われている改行コード
  • WindowsではCR+LFであり,\r\nで表される

コンソール画面が消えない

  • OpenCV 2.1 にバージョンアップしてから,ときたま実行したプログラムが終了しないときがある
  • OpenCV 2.1 + Visual Studio 2003 でコンソールアプリを作成
  • 実行して,正常終了→Visual Studioの画面が実行モードから編集モードに戻る
  • が,それでもコンソール画面が出たまま
  • 少ない事例だが,今のところOpenCVで生成したウィンドウは消えている
  • Visual Studioを終了させてもダメ
  • 再起動させようにも,残ったコンソール画面が悪さをして再起動できない.
  • OpenCV 2.1でウィンドウを生成して,ウィンドウを破棄(cvDestroyWindow)せずにプログラムだけ止めると,発生する模様.

ジャンル:Visual Studio

Visual Studio でコマンドラインアプリをデバッグする際,引数を指定する方法

  • コマンドラインアプリで,引数により挙動を変えるプログラムをよく作る(私は)
  • ただし,デバッグモードでは,引数なしの状態でしか実行されない
  • プロジェクト(P)→プロジェクトのプロパティ(P)→デバッグ→コマンド引数という欄に引数を指定できる
  • Visual Studio 2008 と 2003で最低限確認した.
  • ウィンドウのレイアウトは違うかも
  • 添付はVisual Studio 2008の画面

http://tessy.org/wiki/index.php?plugin=attach&pcmd=open&refer=C%2FC%2B%2B%A4%CE%A5%C8%A5%E9%A5%D6%A5%EB%BD%B8&file=command-line-argument.png

ジャンル:Visual Studio

OpenCV のリポジトリにアクセスしようとしたらユーザ名とパスワードを要求された

  • 本来はOpenCVのリポジトリにuserもpasswordも要らない
  • 最近*5OpenCVのリポジトリが code.ros.org から code.opencv.org に移行した.
    • 更にその昔は CVS でバージョン管理してた時代にはユーザ名があったはずだけれど
  • ちなみにリポジトリ間では互換性(?)が無いので,もう1度 full checkout する必要がある.
  • そして2012年7月26日にOpenCVのリポジトリもSVNからgitに変わった
  • 参考:OpenCV Computer Vision Library ()*6

ビットリバースとポップカウント

  • bit表記した変数(例えば16bitのshort)の中に1がいくつ存在するかをカウントするのがポップカウント
  • bit表記した変数(例えば16bitのshort)のbitの並びを前後逆にするのがビットリバース
  • 10進数16進数2進数ビットリバースポップカウント
    10x0100000001100000001
    20x0200000010010000001
    30x0300000011110000002
    1820xB610110110011011015
    880x5801011000000110103
  • ルックアップテーブルを使うと結構速い。*7*8*9
  • ビット単位で数える/並べ替えると著しく遅い*9*7*8
  • また、マスキングを使った分割統治法もある*10

プリプロセッサ

C言語の文字コード変換について

  • 特に限定してないけれど、基本的にSJIS→UTF-8への変換ができるAPIやライブラリを調べてみた。

::WideCharToMultiByte を使う方法

iconvを使う方法

  1. iconv_t ic = iconv_open("SJIS", "UTF-8");
  2. memcpy( in, utf8, sizeof(utf8) );
  3. iconv( ic, &in, &in_size, &out, &out_size );
  4. iconv_close(ic);

ICUを使う方法

std::string内で使える文字列検索関数

  • STLにあるstd::string内にある関数
    find()・・・指定した文字列が、最初に現れる位置を返す
    rfind()・・・指定した文字列が、最後に現れる位置を返す
    find_first_of()・・・指定した文字列の一部の文字が、最初に現れる位置を返す
    find_last_of()・・・指定した文字列の一部の文字が、最後に現れる位置を返す
    find_first_not_of()・・・指定した文字列の一部に含まれない文字が、最初に現れる位置を返す
    find_last_not_of()・・・指定した文字列の一部に含まれない文字が、最後に現れる位置を返す
  • 引用元:C++編(標準ライブラリ) 第1章 string*27

vector でfindする方法

  1. #include <algorithm>
  2. #include <vector>
  3.  
  4. std::vector<int> datas;
  5. int needle;
  6.  
  7. std::vector<int>::iterator it = std::find(datas.begin(), datas.end(), needle);
  8. if(it == datas.end()){
  9. //見つからなかった場合
  10. std::cout << "Not Found" << std::endl;
  11. }

'>>' should be '> >' within a nested template argument list

  • Visual Studio では通ったが、gccでは通らなかった
    1. std::vector<std::vector<std::string>>  dataArrayNG // '>' が2つ続くと、gccだと叱られる
    2. std::vector<std::vector<std::string> > dataArrayOK // これならOK

cannot appear in a constant-expression

  • gcc で const の宣言と代入を同時に行うと、エラーになる*28

sleep について

iostream のフォーマット指定子

  • printfに慣れてしまったので、書式指定がどうもしっくりこない。
  • ゼロ埋め
    cout << setfill('0') << setw(5) << 20 << endl;
  • 16進数、10進数、8進数も使える*30
    cout << oct << 42;
    cout << dec << 42;
    cout << hex << 42;

typedef の順序

  • いつも混乱する*31
    typdef int MyType; 

<< operator のオーバーロード

  • << operator をオーバーロードしたら、error LNK2005 リンクエラーが発生した。*32
  • 宣言と実装をヘッダとCPPで分ける必要がある。

getopt を使おう

すべてのプログラマが読むべき記事10選

クラスのoperatorを定義するときの戻り値の型

  • 実験した上でまとめてるサイト*38
  • 代入演算
    foo& foo::operator = (const foo&);
  • 四則演算
    const foo foo::operator + (const foo&);
  • 四則演算と代入
    foo& foo::operator += (const foo&);
  • 比較演算
    bool foo::operator == (const foo&);
  • などなど
  • クラスの operator を定義するとき、戻り値の型はどうすべきか*38
  • 実験した上で考察されているので、自分が理解する手助けになった

string

  • 文字を消すときはeraseでchar のindex単位で削除できる
    std::string hoge = std::string("foo");
    hoge.erase(0,1);
    std::cout << hoge << std::endl;
  • 実行結果
    oo

Visual Studio でcppunitをビルドするお話

Sleep関数

複数桁数の数字を文字列に変換する

ある型が定義されているか確認する方法

Cコンパイラとプラットフォームを判定する定義済みマクロ

gccmsvc
64bit (IA64)__ia64___M_IA64
64bit (x86_64)__x86_64___M_X64
32bit (x86)__i386___M_IX86

ビット操作

  • ビット操作だけでかなりの数学的に処理を再現できる
  • 特にループが無くビット操作で再現出来ると、くっそ速い。
  • 参考:Bit Twiddling Hacks *49

streamクラスのeof

Error: use of enum ‘AVCodecID’ without previous declaration

C++でvectorの参照渡しを省略可能にする方法

  • 普通の引数はオプションにすることが可能
    void func(int a, int b = 0);
  • と宣言されていれば、
    func(1);    // func(1, 0) と等価
    func(1, 0); // 上記と同じ挙動
    func(1, 1); // いずれもエラーにならない
  • という呼び方が可能
  • ただ、引数にvector何かをオプションで渡したいときに悩む
    void func(int a, const std::vector<int>& b = std::vector<int>());
  • こうすれば、bのvectorはオプション扱い
  • constを付けないと、gccだと叱られる
  • 参考:shnya_mさんはTwitterを使っています: "@uchumik ディフォルト引数取るってことは、*55
  • 参考:gist:5048103*56

invalid initialization of non-const reference of type

  • Visual Studio では発生しないが、gccで発生するエラー
  • 関数の実引数が一時変数の時は、constを付けないと、エラーになる*57*58
  • 普通の変数と一時的な変数
    • int a などは普通の変数
    • a + 1 の結果もintだが、格納するまでは一時変数
  • サンプルコード
    inline myClass myClass::clone() const
    {
        myClass m;
        return m;
    }
    
    void function1(myClass& before)
    {
        return;
    }
    
    void function2(const myClass& before)
    {
        return;
    }
    
    int main(int argc, char **argv)
    {
        myClass a = myClass();
    
        function1(a);
        function1(a.clone()); // this causes error 'invalid initialization of non-const reference of type'
        function2(a);
        function2(a.clone());
    
        return 0;
    }
    • 前述のサンプルコードのうち、2つ目のcall だけがgccでエラーになる*59
    • Visual Studio では発生しない*60
  • 参考:最近のはまりポイント - 三次元日誌*57
  • 参考:リリカル☆Lisp開発日記 » Blog Archive » C++の参照を使ってもcall by referenceにはならない*58

*1  float vs. double, 2005-08-08公開, 2009-08-15更新, 2013-03-12閲覧
*2  コンパイラの警告 (レベル 1) C4930, 2007-11更新, 2013-08-22閲覧
*3  【VC++】OpenCVのヘッダが C4819ワーニングを出してウザい! « 吟遊詩人の戯言, 2009-07-14公開, 2013-03-12閲覧
*4  How do I fix warning MSB8012 in a static library project in Visual C++ 2010? - Stack Overflow, 2013-06-01投稿, 2013-06-01回答, 2014-11-30閲覧
*5  詳しくはいつだか覚えてないけれど
*6  OpenCV Computer Vision Library (), 2012-04-30投稿, 2013-03-26閲覧
*7  Best Algorithm for Bit Reversal ( from MSB->LSB to LSB->MSB) in C - Stack Overflow, 2012-11-26閲覧
*8  ビットリバース - sileの日記, 2012-11-26閲覧
*9  ビットを数える・探すアルゴリズム, 2004-05-04公開, 2012-09-01更新, 2013-05-09閲覧
*10  ビットリバース - 簡潔なQ, 2012-11-26閲覧
*11  Man page of cpp, 1993-04-30公開, 2013 -03-11更新, 2013-03-12閲覧
*12  16.3 プリプロセッサ cpp, 2013-03-12閲覧
*13  C言語のプリプロセスのメモ(Hishidama's C pre-process Memo), 2006-10-30更新, 2015-01-13閲覧
*14  its55 lab ≫ C++でShift-JISをUTF-8に変換する, 2008-06-11公開, 2013-03-26閲覧
*15  its55 lab ≫ C++でUTF-8をShift-JISに変換する, 2008-06-25公開, 2013-03-26閲覧
*16  WideCharToMultiByte 関数 - msdn, 2013-03-26閲覧
*17  MultiByteToWideChar 関数 - msdn, 2013-03-26閲覧
*18  GetTextCharset 関数 - msdn, 2013-03-26閲覧
*19  IsTextUnicode 関数 - msdn, 2013-03-26閲覧
*20  文字コードの変換ライブラリ | プログラマーズ雑記帳, 2011-11-24公開, 2013-03-26閲覧
*21  LinuxのC言語で Shift-JIS と UTF-8 の相互変換 - かおるんダイアリー , 2010-03-12公開, 2013-03-26閲覧
*22  ICU Shift_JISとUTF-8の変換 - Faith and Brave - C++で遊ぼう, 2010-03-18公開, 2013-03-26閲覧
*23  ICU - International Components for Unicode, 2013-03-26閲覧
*24  C/C++あれこれ/文字コード変換ライブラリICUのサンプル(UTF-8→SJIS)です。 - 笑猫酒家, 2010-04-29公開, 2012-08-08修正, 2013-03-26閲覧
*25  utf 8 - C++ UTF-8 output with ICU - Stack Overflow, 2010-04-29投稿, 2013-03-26閲覧
*26  ICU による文字コード変換ライブラリ - yanoの日記, 2010-08-22公開, 2013-03-26閲覧
*27  C++編(標準ライブラリ) 第1章 string, 2013-04-10更新, 2013-04-16閲覧
*28  Cannot appear constant-expression? - yukimiの成長記, 2009-04-08公開, 2016-02-19閲覧
*29  時間測定関数の性能(分解能と最大値)のまとめ, 2013-08-22閲覧
*30  C++ の iostream フォーマット指定早見表, 2012-04-13公開, 2013-08-22閲覧
*31  typedefの使い方, 2013-08-22閲覧
*32  c++ - overloading << for my class - Stack Overflow, 2011-08-20投稿, 2013-08-28閲覧
*33  向川康博, getoptによるオプション解析, 1998-08-18公開, 2004-06-16更新, 2014-06-30閲覧
*34  すべてのプログラマが読むべき記事10選 | POSTD, 2014-06-27公開, 2014-06-30閲覧
*35  Javin Paul, 10 Articles Every Programmer Must Read, 2014-05-13公開, 2014-06-30閲覧
*36  David Goldberg, What Every Computer Scientist Should Know About Floating-Point Arithmetic, 1991-03公開, 2014-06-30閲覧
*37  Ulrich Drepper, What Every Programmer Should Know About Memory, 2007-11-21公開, 2014-06-30閲覧
*38  クラスの operator を定義するとき、戻り値の型はどうすべきか, 2012-04-07更新, 2014-11-30閲覧
*39  CppUnit - C++ port of JUnit | SourceForge.net, 2008-02-20更新(v1.12.1), 2014-11-30閲覧
*40  skmk, Visual Studio C++でCppUnitをビルドできない、そんなとき | skmks, 2011-01-25公開, 2011-04-16更新, 2014-11-30閲覧
*41  επιστημη(えぴすてーめー), 連載 C++開発者のための単体テスト入門:第2回 C++アプリケーションの効率的なテスト手法(CppUnit編) (1/4) - @IT, 2007-08-17更新, 2014-11-30閲覧
*42  What is the proper #include for the function 'sleep' in C? - Stack Overflow, 2013-02-11投稿, 2013-02-11回答, 2014-04-18更新, 2014-11-30閲覧
*43  Alternative to itoa() for converting integer to string C++? - Stack Overflow, 2008-10-23投稿, 2008-10-23回答, 2013-05-07更新
*44  c++ - How to check if a datatype is "defined" with typedef - Stack Overflow, 2010-08-18投稿, 2010-08-18回答, 2014-12-01閲覧
*45  Jonathan de Boyne Pollard, FGA: Predefined macros in C/C++ that tell you what the target processor is., 2014-05-12閲覧
*46  定義済みマクロ, VS2013, 2014-05-12閲覧
*47  Pre-defined Compiler Macros / Wiki / Architectures, 2014-07-11更新, 2014-09-25閲覧
*48  Pre-defined Compiler Macros / Wiki / Compilers, 2015-07-02更新, 2016-08-17閲覧
*49  Sean Eron Anderson, Bit Twiddling Hacks, 2014-08-04閲覧
*50  【C/C++】 streamクラスのeofメンバ: 日々此精進, 2009-12-12公開, 2015-01-13閲覧
*51  Build problems for openCV 2.4.1 with Ubuntu 12.04 LTS - OpenCV Q&A Forum, OpenCV 2.4.1, Ubuntu 12.04, 2013-04-28投稿, 2014-11-21更新, 2015-06-09閲覧
*52  Install OpenCV 2.4 on Ubuntu 12.04 « So Tired !_!, OpenCV 2.4, Ubuntu 12.04, 2012-07-17公開, 2015-06-09閲覧
*53  OpenCV Lover: Install Opencv 2.3.1 on Ubuntu 12.04 Precise Pangolin, OpenCV 2.3.1, Ubuntu 12.04, 2015-06-09閲覧
*54  How to install FFmpeg on Debian? - Super User, 2011-05-21投稿, 2015-01-16更新, 2015-06-09閲覧
*55  shnya_mさんはTwitterを使っています: "@uchumik ディフォルト引数取るってことは、, g++ 4.4, 2013-02-27公開, 2015-06-09閲覧
*56  gist:5048103, 2013-02-27公開, 2015-06-10閲覧
*57  最近のはまりポイント - 三次元日誌, 2008-11-19公開, 2016-02-08閲覧
*58  リリカル☆Lisp開発日記 » Blog Archive » C++の参照を使ってもcall by referenceにはならない, 2011-06-05公開, 2016-02-08閲覧
*59  gcc 4.6.3で確認したが、どれも同じだと思う
*60  Visual Studio 2012で確認

添付ファイル: filecommand-line-argument.png 124688件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-17 (水) 12:14:23 (41d)