Comments 21
>i too like
мгимо финишд
Хорошая статья!
Я выругался матом и меня оштрафовали!
Русский язык плохой, потому что позволяет так делать.
на тот момент я использовал MS Visual Studio 2013 и встроенный в него MSVC-компилятор
Оно же макросы подсвечивает другим цветом, что там искать 2 часа?
Ждал комментария:
#define true false
Но не увидел. Пришлось написать самому.
В современном С++ вроде макросы не очень хороший стиль, и модулями уже можно заменять беспорядочные 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.
#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>
препроцессор воспринимает, как разные аргументы препроцессора, о чём мне компилятор сразу и сообщил в логе ошибок.
Согласен, ошибка довольно простая и решается довольно легко, просто хотел поделится случаем из своей практики.
#define CPP WTF