Проблема с макросами

Под [branch "master"], попытайтесь добавить следующее к файлу конфигурации Мерзавца repo (.git/config):

[branch "master"]
    remote = origin
    merge = refs/heads/master

Это говорит Мерзавцу 2 вещи:

  1. , Когда Вы находитесь на основном ответвлении, удаленное значение по умолчанию является источником.
  2. При использовании git pull на основном ответвлении, без удаленного и определенного ответвления, используют значение по умолчанию, удаленное (источник) и слияние в изменениях от удаленного основного ответвления.

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

, Если Вы не хотите редактировать файл конфигурации вручную, можно использовать инструмент командной строки вместо этого:

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master
5
задан EvilTeach 29 August 2009 в 13:45
поделиться

4 ответа

Нил Баттерворт, Марк и Павел правы.

КВАДРАТ (++ y) заменяется на ++ y * ++ y, что увеличивает вдвое значение y.

Другой проблема, с которой вы можете столкнуться: КВАДРАТ (a + b) расширяется до a + b * a + b, который не является (a + b) * (a + b), но a + (b * a) + b. Вы должны позаботиться о добавлении круглых скобок вокруг элементов, когда это необходимо при определении макросов: #define SQUARE (X) ((X) * (X)) немного менее рискованно. (Ян Кемп написал это первым в своем комментарии)

Вместо этого вы можете использовать встроенную функцию-шаблон (не менее эффективную во время выполнения), подобную этой:

template <class T>
inline T square(T value)
{
    return value*value;
}

Вы можете проверить, что она работает:

int i = 2;
std::cout << square(++i) << " should be 9" << std::endl;
std::cout << square(++i) << " should be 16" << std::endl;

(нет необходимости писать

square<int>(++i)

, поскольку тип int неявен для i)

16
ответ дан 18 December 2019 в 05:20
поделиться

Поскольку макрос расширяется до:

++y * ++y

, что дает неопределенное поведение в C ++ - результат может быть чем угодно. Эта хорошо известная проблема должна быть освещена в любом приличном учебнике, посвященном использованию макросов. Какой из них вы используете?

15
ответ дан 18 December 2019 в 05:20
поделиться

Поскольку макросы выполняют текстовую замену, поэтому написанный вами код расширяется до

printf("%d\n",++y * ++y );

, а затем порядок операций не определен, поэтому компилятор видит 2 приращения, а затем умножение

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

Во-вторых, не предполагайте, что произойдет, если вы увеличите и используете переменные

5
ответ дан 18 December 2019 в 05:20
поделиться

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

Когда вы пишете SQUARE (x) , фактического вызова функций не происходит, изменяется только текст. Операция довольно глупая, поэтому в таких случаях, как ваш, вам придется принять дополнительные меры предосторожности. Обратитесь к другим ответам для объяснения вашего случая.

5
ответ дан 18 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: