Могу ли я добавить числа с препроцессором C / C ++?

Единственное решение, о котором я могу думать, это изменение вашей разметки. Я бы изменил его таким образом, чтобы взять один столбец и записать его как строку в разметке. Вот скрипка, которую я создал: http://jsfiddle.net/MHsxU/

13
задан Lundin 25 August 2017 в 10:58
поделиться

5 ответов

Я почти уверен, что препроцессор C / C ++ просто копирует и вставляет - он фактически не оценивает никакие выражения. Оценка выражения выполняется компилятором.

Чтобы лучше ответить на ваш вопрос, вы можете опубликовать то, что вы пытаетесь достичь.

0
ответ дан 1 December 2019 в 19:01
поделиться

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

#include <iostream>
using namespace std;

template <int N, int M>
struct Add
{
    static const int Value = N + M;
};

int main()
{
    cout << Add<4, 5>::Value << endl;
    return 0;
}
5
ответ дан 1 December 2019 в 19:01
поделиться

Препроцессор C может оценивать условные выражения, содержащие целочисленную арифметику. Он не будет заменять арифметические выражения и передавать результат компилятору, но компилятор будет оценивать арифметические операции над константами времени компиляции и передавать результат в двоичный файл, если вы не перегрузили используемые операторы.

1
ответ дан 1 December 2019 в 19:01
поделиться

Макросы препроцессора не умеют выполнять арифметические операции, но их можно с пользой использовать для математических вычислений с перечислениями. Общий трюк состоит в том, чтобы иметь макрос, который вызывает другие макросы и может быть повторно вызван с использованием различных определений этих других макросов.

Например, что-то вроде:

#define MY_THINGS \
  a_thing(FRED,4) \
  a_thing(GEORGE,6) \
  a_thing(HARRY,5) \
  a_thing(HERMIONE,8) \
  a_thing(RON,3) \
  // This line left blank 

#define a_thing(name,size) EN_##name}; enum {EN_SIZE_##name=(size),EN_BLAH_##name = EN_##name+(size-1),
enum {EN_FIRST_THING=0, MY_THINGS EN_TOTAL_SIZE};
#undef a_thing

Это позволит «выделить» определенное количество места для каждой вещи, например, в массив. Математические операции препроцессором не выполняются, но перечисления по-прежнему считаются константами времени компиляции.

1
ответ дан 1 December 2019 в 19:01
поделиться

Препроцессор выполняет предварительную обработку токенов, и единственный раз, когда он оценивает числа, — это оценка директивы #if или #elif. В остальном числа во время предварительной обработки на самом деле не являются числами; они классифицируются как токены числа предварительной обработки, которые на самом деле не являются числами.

Вы можете оценить базовую арифметику, используя конкатенацию токенов:

#define ADD_0_0 0
#define ADD_0_1 1
#define ADD_1_0 1
#define ADD_1_1 2

#define ADD(x, y) ADD##_##x##_##y

ADD(1, 0) // expands to 1
ADD(1, 1) // expands to 2

На самом деле, нет причин делать это, и было бы глупо делать это (вам пришлось бы определять огромное количество макросов, чтобы это было даже отдаленно полезный).

Было бы более разумно иметь макрос, который расширяется до целочисленного константного выражения, которое может быть вычислено компилятором:

#define ADD(x, y) ((x) + (y))

ADD(1, 1) // expands to ((1) + (1))

Компилятор сможет вычислить выражение 1 + 1.

12
ответ дан 1 December 2019 в 19:01
поделиться