Есть ли способ проверить нечисловое значение макроса

предположим, что я

#define Name Joe

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

#if   Name==Joe
// some code
#elif Name==Ben
// some alternative code
#endif

Я хочу использовать это для создания различных объектных файлов из одного исходного кода. Источник отличается только немного, поэтому может легко управляться макросом. Макрос должен быть передан через -DName=Joe флаг компилятора. Обратите внимание также, что Name будет фактическим именем символа, поэтому мы не можем использовать трюки на основе #define Joe 1 etc.


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

2 ответов


Да, это возможно, но это не все, что красиво.

вот пример; измените имя, и он напечатает правильную вещь. Вам просто нужно определить TEST_FOR_Name заранее для каждого имени, давая каждому уникальное значение.

#define TEST_FOR_Joe 1
#define TEST_FOR_Ben 2
#define DO_TEST(NAME1, NAME2) DO_TEST_impl(NAME1, NAME2)
#define DO_TEST_impl(NAME1, NAME2) TEST_FOR_ ## NAME1 == TEST_FOR_ ## NAME2

#define NAME Ben

#include <iostream>

int main() {
  std::cout << "Hello!" << std::endl;
#if DO_TEST(NAME, Joe)
  std::cout << "Joe Found!" << std::endl;
#elif DO_TEST(NAME, Ben)
  std::cout << "Ben Found!" << std::endl;
#else
  std::cout << "Neither found!" << std::endl;
#endif
}

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


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