web-dev-qa-db-ja.com

読みやすくするために、スペースを含むC ++ソースコードに大量のコードを書き込む方法はありますか?

私がコードを持っていると想像してください:

vector<int> temp = vector<int>(1 000 000 000);

コンパイラはスペースについて文句を言うので、上記はコンパイルされません。コンパイル時にこれらのスペースを省略するようにC++に指示すること、またはそうでなければ数を読みやすくすることは可能ですか?

43
Makogan

桁区切り記号を試してください:

int i = 1'000'000'000;

この機能が導入されました C++ 14以降 。一重引用符(')を桁区切り記号として使用します。


参照:

103
user2486888

C++ 14のないプラットフォーム(一般的にはマイクロプロセッサ用)で同様のことをしたとき、乗算で分割することで大きな数値を表現しました。

int i = (1000 * 1000 * 1000);

ULまたはLの接尾辞をテイストに追加します

ここでの利点は、基本的にC89(およびおそらくそれ以前)をサポートするすべてのプラットフォームに準拠していることです。

一般に、コンパイル時に乗算演算子が抜けると想定するのはおそらく安全ですが、ループでこのような定数を使用している場合は、再確認する価値があります。

31
Fake Name

私は通常、この目的のために定数を定義します。これはゼロのカウントを節約し、コードを表示する人にとって何を意味するかを非常に明確にするためです。例えば

#define THOUSAND 1000
#define MILLION 1000000

vector<int> temp = vector<int>(THOUSAND * MILLION);

これは、私が本当に10億を意味し、ゼロを誤ってカウントしなかったことを明確にします

もちろん、必要に応じて列挙型を使用できます。

10
pico-help

C++ 14を使用しない場合、別のオプションは、暗黙的なint-castと、おそらくコンストラクタ内の正規表現チェックを使用して、数を制限する何らかの文字列継承クラスを使用します。簡単な例としてCStringを使用します。

class NumString : public CString
{
public:
    NumString(CString number) : num(number) { } //maybe insert some regex-check here
    operator long() const
    {
        CString tmp = num;
        tmp.Remove(' ');        
        return atol(tmp);
    }
private:
    CString num;
};


NumString a = "1 000 000 000";
int b = a;
bool test = b == 1000000000;
//test will be true
1
Otto V.

これは、C++ 14なしで私の最初の不器用なアプローチを数字でグループ化することを思い出します
だろう

#define INTGROUPED1(a)     (a%1000)
#define INTGROUPED2(a,b)   (a%1000*1000 + b%1000)
#define INTGROUPED3(a,b,c) (a%1000*1000000 + b%1000*1000 + c%1000)
int v1 = INTGROUPED1(        123);
int v2 = INTGROUPED2(    123,123);
int v3 = INTGROUPED3( 23,123,123);

しかし、私はプライベートコンテキストではなく、このようなトリックを使用します。

誰かが書いていると考えてください

INTGROUPED3(1234,1234,1234); //This would be (234,234,234) without a compiler complaining

EDIT1:

たぶんより良いアプローチは##プリプロセッサ演算子を使用することでしょう

#define NUM_GROUPED_4ARGS(a,b,c,d) (##a##b##c##d)
int num = NUM_GROUPED_4ARGS(-2,123,456,789); //int num = (-2123456789);

これはWYSIWYGに似ていますが、誤用を免れません。例コンパイラーに文句を言うかもしれません

int num = NUM_GROUPED_4ARGS(-2,/123,456,789);  //int num = (-2/123456789); 

しかし、そうではありません。

0
grenix

別のアイデアは次のとおりです。

#define _000 *1000

int k = 1 _000 _000;
0
Raul J