Это возможно, но только в ограниченном случае, когда вы ищете пустые определяет (как это часто бывает с флагами компиляции) или где вы знаете диапазон способов определения флага, например, с помощью 0 или 1.
Вот рабочий код:
#include <iostream>
// Define two genetic macros
#define SECOND_ARG(A,B,...) B
#define CONCAT2(A,B) A ## B
// If a macro is detected, add an arg, so the second one will be 1.
#define DETECT_EXIST_TRUE ~,1
// DETECT_EXIST merely concats a converted macro to the end of DETECT_EXIST_TRUE.
// If empty, DETECT_EXIST_TRUE converts fine. If not 0 remains second argument.
#define DETECT_EXIST(X) DETECT_EXIST_IMPL(CONCAT2(DETECT_EXIST_TRUE,X), 0, ~)
#define DETECT_EXIST_IMPL(...) SECOND_ARG(__VA_ARGS__)
// We will create MY_DEFINE, but not MY_DEFINE2
#define MY_DEFINE
int main()
{
// We can now use DETECT_EXIST to detect defines.
std::cout << "MY_DEFINE = " << DETECT_EXIST(MY_DEFINE) << std::endl;
std::cout << "MY_DEFINE2 = " << DETECT_EXIST(MY_DEFINE2) << std::endl;
}
Этот код будет производить вывод:
MY_DEFINE = 1
MY_DEFINE2 = 0
Так как первый действительно существует, а второй делает нет.
Если макрос установлен в значение, такое как 1, вам просто нужно иметь альтернативную версию DETECT_EXIST_TRUE, чтобы обработать ее, с макроснимком, вставленным в конец. Например:
#define DETECT_EXIST_TRUE1 ~,1
Тогда, если у вас есть:
#define MY_DEFINE1 1
код, как это будет работать правильно в основной:
std::cout << "MY_DEFINE1 = " << DETECT_EXIST(MY_DEFINE1) << std::endl;
AFAIK no. но C++ 17 представит constexpr if, что означает оператор if, который оценивается только во время компиляции. возможно, это опция –
К сожалению, это не поможет в этом случае, так как я не смогу выполнить '' 'if constexpr (MACRO)' '', если макрос не определен :( –
Почему бы просто не поставить зависимый код в блоках if и else? – NathanOliver