Есть ли способ написать большое количество в C++ исходном коде с пробелами, чтобы сделать его более читаемым?

Представьте, что у меня есть код:

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

Вышеупомянутое не будет компилироваться, поскольку компилятор будет жаловаться на пробелы. Можно ли указать C++ опустить эти пространства при компиляции или иным образом упростить чтение номера?

Ответ 1

Попробуйте разделитель цифр:

int i = 1'000'000'000;

Эта функция введена с C++ 14. Он использует одиночную кавычку (') в качестве разделителя цифр.


Также см:

Ответ 2

Когда я делал подобные вещи на платформах без С++ 14 (как правило, для микропроцессоров), я представлял большие числа, разделив его на умножение:

int i = (1000 * 1000 * 1000);

Добавить UL или L postfixes по вкусу

Преимущество здесь в том, что оно совместимо в основном с любой платформой, поддерживающей C89 (и, возможно, раньше).

Вообще, вероятно, безопасно предположить, что операторы умножения выпадут во время компиляции, но если вы используете константы, подобные этому в цикле, возможно, стоит дважды проверить.

Ответ 3

Я обычно #define константы для этой цели, поскольку он экономит отсчеты нулей и дает понять, что вы имеете в виду для всех, кто просматривает код. Например

#define THOUSAND 1000
#define MILLION 1000000

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

Это дает понять, что я действительно имею в виду тысячу миллионов человек и не допускал ошибок в нулях

Очевидно, вы можете использовать перечисления, если хотите.

Ответ 4

Если вы не используете С++ 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

Ответ 5

Другая идея может быть:

#define _000 *1000

int k = 1 _000 _000;

Ответ 6

Поскольку это напоминает мне цифру, группирующую мой первый неуклюжий подход без С++ 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:

Возможно, лучший aproach будет использовать оператор ## препроцессора

#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, но не застраховано от неправильного использования. E. g. вы можете компилятору жаловаться на

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

но это не будет.