C ++ макрос без пробелов - PullRequest
       33

C ++ макрос без пробелов

2 голосов
/ 17 августа 2011

Мне нужен макрос для расширения до комментария c ++, это возможно?

У меня есть это:

#define SLASH(x,y) x y
#define OUT SLASH(/,/)

int main(int argc, char *argv[])
{
  OUT << "text";
  return 0;
}

И нужно расширить до этого:

{
  // << "text";
  return 0;
}

Я тоже пробовал это:

#define SLASH(x) /x
#define OUT SLASH(/)

Но результат все тот же:

int main(int argc, char *argv[])
{
  / / << "text";
  return 0;
}

Ответы [ 5 ]

5 голосов
/ 17 августа 2011

Нет, это невозможно, потому что в C ++ комментарии удаляются до развертывания макросов.

(см. 2.1 стандарта, удаление комментариев происходит на этапе 3, расширение макроса на этапе 4.)

2 голосов
/ 17 августа 2011

Как насчет замены его функциональным объектом, который ничего не делает вместо этого?

static class NullOutput { 
public:
    template <typename T> 
    const NullOutput &operator<<(T arg) const { 
        return *this; 
    }
} NullOutputObj;

#define OUT NullOutputObj

Чистый результат состоит в том, что объект удаляется из кода и заменяется встроенными расширениями шаблонов, которые затем оптимизируются, поскольку они ничего не делают.Результат абсолютно лишен кода.

1 голос
/ 17 августа 2011

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

1 голос
/ 17 августа 2011

Комментарии удаляются из исходного кода перед запуском препроцессора.Таким образом, вы не можете сделать это.

0 голосов
/ 03 мая 2013

альтернатива тому, чего вы хотите достичь, будет такой:

http://donjaffer.blogspot.in/2012/09/dprintf-debug-macro-in-c.html

#define DEBUG   // comment if you do not want the debug statments to appear.

#ifdef DEBUG
#define DPRINTF(fmt, ...) \
    do { printf("my_file: " fmt, ## __VA_ARGS__); } while (0)
#else
#define DPRINTF(fmt, ...) \
    do { } while (0)
#endif

везде, где вы пытаетесь распечатать выписки, вместо COUT << вы можете использовать </p>

DPRINTF("Your text here\n");
...