Можно ли использовать `#ifdef` внутри макроса?

Я нашел только этот связанный вопрос, это не совсем то, что я ищу.

Раньше у меня были макросы, определенные внутри оператора #ifdef:

#ifdef DEBUG
#   define PRINT_IF_DEBUGGING(format) printf(format);
#   define PRINTF_IF_DEBUGGING(format, ...) printf(format, __VA_ARGS__);
#else
#   define PRINT_IF_DEBUGGING(...)
#   define PRINTF_IF_DEBUGGING(...)
#endif

Теперь я хочу сделать обратное, чтобы операторы #ifdef были внутри макросов. Что-то вроде этого:

#define PRINT_IF_DEBUGGING(format, ...) \
#if defined(DEBUG) print(format); #endif
#define PRINTF_IF_DEBUGGING(format, ...) \
#if defined(DEBUG) printf(format, __VA_ARGS__); #endif

Однако у меня возникла проблема с использованием __VA_ARGS__ внутри #ifdef defined.

error: '#' is not followed by a macro parameter
 #define PRINT_IF_DEBUGGING(format, ...)
error: '#' is not followed by a macro parameter
 #define PRINTF_IF_DEBUGGING(format, ...)
warning: __VA_ARGS__ can only appear in the expansion of a C++11 variadic macro
 #if defined(DEBUG) printf(format, __VA_ARGS__); #endif

Это возможно?

Чем больше я на это смотрю, тем больше удивляюсь, Зачем, вы бы хотели отказаться от чего-то, что читабельно и работает.

Ted Lyngmo 17.05.2022 01:38

Допустим, я изучал новые способы использования макросов. Если бы мое намерение было возможным, я мог бы использовать #define DEBUG, чтобы включить printf для сегмента кода, а не для всего программного кода.

Eduardo Reis 17.05.2022 03:56

Другими словами, хотелось бы, чтобы компилятор определял код не при разборе определения макроса PRINTF_IF_DEBUGGING, а при разборе его использования.

Eduardo Reis 17.05.2022 04:02
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
3
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

В любом случае, просто измените это:

#if defined(DEBUG) print(format); #endif

к этому:

#if defined(DEBUG)
    print(format);
#endif

и так далее, и это должно исправить это.

Fwiw, я думаю, что это должен будет ответом :-)

Ted Lyngmo 17.05.2022 01:11

@TedLyngmo Цитируя Кеннет Уолстенхоум RIP, «это сейчас» :) Хммм, я вижу, что Википедия испортила цитату. Ну что ж.

Paul Sanders 17.05.2022 01:13

Это не решило проблему. Обратите внимание, что проблема связана со вторым макросом, который может оцениваться как printf(format, __VA_ARGS__).

Eduardo Reis 17.05.2022 01:22

@EduardoReis Ваш обновленный код показывает, что вы все еще пытаетесь поместить несколько директив препроцессора в одну строку. Это совсем не то, что предложил Пол.

Ted Lyngmo 17.05.2022 01:25

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

Paul Sanders 17.05.2022 01:26

PS: Я откатил вашу правку. Редактировать вопросы, на которые были даны ответы таким образом, что ответ становится недействительным, запрещено. И если вы примете к сведению и будете действовать в соответствии с тем, что сказал вам @ted, ваша вторая проблема может исчезнуть в любом случае.

Paul Sanders 17.05.2022 01:28
Ответ принят как подходящий

Вы не можете использовать #ifdefвнутри из #define , так что нет, это невозможно. Первый код, который вы показали, является правильным решением.

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

Похожие вопросы

Ошибка: ожидался неполный идентификатор перед токеном «{» в Linux gcc
Используют ли предварительно скомпилированные заголовки предварительно скомпилированные заголовки, если они включены, или они предназначены только для файлов .cpp?
Введите каламбур в константном / статическом инициализаторе (построение константы с плавающей запятой из битов)
Могу ли я добавить другую функцию, определенную в моем коде, в вектор, такой как массивы, которые включают адрес функции?
Есть ли способ «сбросить» переменные функций?
Ошибка C2679: бинарный '>>': оператор не найден
Не удается вызвать указатель функции структуры на метод класса
Как работает параметр приблизительноPolyDP и эпсилон?
Как вставить запись в Microsoft Access с помощью MFC?
Включение предварительно скомпилированного заголовка и непредварительно скомпилированного заголовка в файл .cpp приводит к тому, что файл .cpp не распознает непредварительно скомпилированный заголовок.