Передача параметров в неиспользуемый макрос в C++

Я получаю следующее сообщение об ошибке

error: '0' cannot be used as a function

при попытке скомпилировать следующую строку:

NOOP(0 != width);

NOOP определяется следующим образом:

#define NOOP (void)0

Исходный код является частью SDK - так что все должно быть в порядке. И я узнал, что (void)0 на самом деле это правильный способ описать "без операции" в C++. Но почему вы хотите передать логический параметр функции, которая ничего не делает? А как избавиться от сообщения об ошибке?

2 ответа

MACRO не определен с какими-либо параметрами, поэтому после того, как препроцессор заменит код, этот оператор будет выглядеть так:

(void)0(0 != width);

Что сбивает с толку компилятора, заставляя его думать, что вы пытаетесь использовать оператор "()" в 0. (то есть, используя 0 в качестве функции)

Я рекомендую вам опустить "(0!= Width)" (это вводит в заблуждение) и просто написать NOOP;

"(void)0(0!=width);msgstr "недопустим C++, поэтому это не нормально. (void)0; сам по себе ничего не делает в C++, поэтому может быть использован как noop. Вместо вашего текущего определения я бы использовал:

#define NOOP(X) (void)0

Это говорит препроцессору C++, что есть функция препроцессора, называемая NOOP который принимает один параметр любого типа и заменяет весь вызов функции (void)0, Так что, если у вас есть строка кода, которая говорит NOOP("HELLO WORLD")то препроцессор заменяет всю эту (void)0, который компилятор C++ продолжает игнорировать.

Другие вопросы по тегам