2015-12-17 3 views
1

У меня есть макрос в функции, которая создает экземпляр переменной данного типа (и делает пару других вещей, которые не имеют значения).Как долго длится typedef?

По существу MACRO(foo, f) расширяется до foo f;

Но если foo это сказать std::map<int, int> то расширение не удается из-за дополнительной запятой.

Я обхожу это, написав typedef std::map<int, int> bar;, а затем MACRO(bar, b).

Я обеспокоен тем, что я утечка typedef s в источник программы, который может вызвать у меня проблемы в будущем.

Итак, как долго длится typedef?

+3

Возможно, вы можете прочитать о проблеме [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – jtbandes

+0

Подождите, так что вы говорите, что ' typedef std :: map foo; MACRO (foo, f) 'не компилируется? Я считаю, что трудно поверить. – CompuChip

+0

btw "(и делает пару других вещей, которые не актуальны)" - довольно распространенное заблуждение. Нет ничего несущественного, если это связано с вопросом. Если ваш вопрос связан с макросом, тогда покажите нам макрос (или дистиллированную версию, которая показывает то же поведение в отношении вопроса), но, пожалуйста, не утверждайте, что это не имеет значения. – user463035818

ответ

7

Правила для typedef Доступны те же, что и для переменной, поэтому в вашем случае она будет «последней» до тех пор, пока тело функции.

Вы могли бы проверить это самостоятельно, написав

{typedef std::map<std::string, std::string, iLT> location_map;}

и наблюдая за ошибки компилятора: как только блок существует пространство, сама typedef выходит за рамки.

3

typedef продолжается до конца единицы перевода в глобальном масштабе или области пространства имен.

или конец scope если положить внутри другой scope.