Pull to refresh

Comments 21

UFO just landed and posted this here

Э-э-э, а как ещё можно перегрузить оператор new без использования ключевого слова new?

А свой operator new в классе уже запретили объявлять?

Я выругался матом и меня оштрафовали!

Русский язык плохой, потому что позволяет так делать.

на тот момент я использовал MS Visual Studio 2013 и встроенный в него MSVC-компилятор

Оно же макросы подсвечивает другим цветом, что там искать 2 часа?
Не знаю как автор, но когда я вижу десятки цветов подсветки то они ничего для меня уже не значат. Просто радуга, почти так. Раньше делал свои цветовые схемы, но надоело.
Просто воспринимаю как дополнение к красивому форматированию, блоки разделяет ну и ладно.

Вам достаточно видеть, что ключевое слово подсвечивается как-то странно. Это сложно не заметить.

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

Ждал комментария:

#define true false

Но не увидел. Пришлось написать самому.

UFO just landed and posted this here
UFO just landed and posted this here

В современном С++ вроде макросы не очень хороший стиль, и модулями уже можно заменять беспорядочные include, зачем же вот это все((

В статье говорится, что #include рекурсивно из коробки...

Это что же получается, можно говнокодить в таком вот стиле?

// устанавливаем аргументы
#define FOO foo
#define BAR bar
#define TIMES 100500
// и вызываем макропроцедуру
#include "foobar_n_times.h"

/// где foobar_n_times.h

#if (TIMES) > 0

FOO BAR  // какое-то содержательное действо с аргументами инклуда

#define TIMES (TIMES-1) // ???? хз как это правильно сделать
#include "foobar_n_times.h"
#endif

Старая добрая грабелька от микрософта. Очень старая. На неё наступали ещё пользователи MSVC 6, если вообще не 4.

А ведь и gcc (начиная с 4.8.1, 2013 год) и clang (как минимум начиная с 3.0) показывают ошибку сразу и чётко. Я сначала думал, что проблема в "давным-давно", но msvc до сих пор пишет на такой код какую-то ерунду...

#include <windows.h>

int main(int argc, char* argv[])
{
    int x = 0;
    int y = 0;
    return max(++x, y);   // return 2. "Why? Because fuck you, that's why."
}

Старая, заезженная тема. Особенно интересно, когда аргументы макроса имеют побочные эффекты.

Кто не знает, в С++ для Unreal Engine используется множество разных макросов. Один из таких макросов - DECLARE_EVENT_OneParam, который в качестве первого аргумента принимает имя нужного события, а в качестве второго - тип даных, который должен принимать метод, подписавшийся на это событие.

Я написал примерно такой код:

DECLARE_EVENT_OneParam(FOnEventName, TMap<int32, FName>);

Как думаете, где здесь ошибка?

Ответ

Как было сказано в статье: "препроцессор формирует единицы трансляции", в этом собственно и проблема. Следующие куски кода:TMap<int32 и FName> препроцессор воспринимает, как разные аргументы препроцессора, о чём мне компилятор сразу и сообщил в логе ошибок.

Согласен, ошибка довольно простая и решается довольно легко, просто хотел поделится случаем из своей практики.

Sign up to leave a comment.