Макрос C ++ неправильно завершен вызов макроса - PullRequest
3 голосов
/ 29 июля 2011

В C ++ есть механизм, позволяющий выражать не завершенные макросы? Это надуманный пример:

#define MACRO(x, y) x + y
#define MACROC1(x) MACRO(x, 
#define MACROC2(y) y)
//...expecting 3
int foo = MACROC1(1) MACROC2(2);

Я получаю сообщение об ошибке некорректно прерванного вызова макроса из MSVC.

Когда я запускаю cl -E file.cpp , я вижу, что был сгенерирован код ниже:

int c = 1 + 1 +  2);

В Visual Studio компиляция завершается с ошибками: ошибка C2059: синтаксическая ошибка: ')' IntelliSense: неправильно завершенный вызов макроса

Ответы [ 2 ]

5 голосов
/ 29 июля 2011

Я не думаю, что это возможно. Прекомпилятор C расширяет макросы в первую очередь по глубине, поэтому MACROC1 будет полностью расширен до того, как MACROC2 будет даже рассмотрен. Затем он найдет MACRO с неполным списком аргументов и выдаст ошибку.

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

1 голос
/ 29 июля 2011

Ваш код будет переведен на:

int foo = MACRO(1, 2;

Что не так - это неполный (неправильно завершенный) вызов макроса MACRO.

...