Эмуляция, если __name__ == __main__ в c ++ вызывает ошибку & quot; функционально-подобный макрос не определен & quot;

Я пишу простой файл сборки с помощью bash, то есть, чтобы мне было проще переключать точки входа, эмулируя Python

if __name__ == __main__:
main()

Моя идея заключалась в том, чтобы включить макрос, передав -D __MAIN__=\"$MAIN_FILE\" лязгать ++, где MAIN_FILE это файл, который вы указываете при запуске скрипта сборки. Тогда мне просто нужно сравнить макрос __MAIN__ к предопределенному стандартному макросу __FILE__ для каждого исходного файла. Что-то вроде этого:

#if equals(__FILE__, __MAIN__)
int main()
{
/* code */
return 0;
}
#endif

Проблема, с которой я сталкиваюсь, заключается в создании функции equals работать во время компиляции. Читая об этом, кажется, что должно быть возможно определить функцию constexpr, которая сравнивает строки во время компиляции (по крайней мере, в соответствии с этот а также этот ответ).

Однако всякий раз, когда я пытаюсь создать такую ​​функцию (или копировать код из Вот или же Вот), Я получаю следующую ошибку:

ошибка: функциональный макрос «равно» не определен

Что мне кажется странным, так как это не макрос и не неопределенность. Я не смог найти решение при поиске сообщения об ошибке.

Вот полный код для справки:

#include <iostream>

constexpr bool equals(const char* a, const char* b)
{
return *a == *b && (*a == '\0' || equals(a + 1, b + 1));
}

#if equals(__FILE__, __MAIN__)
int main()
{
std::cout << "Running " << __MAIN__ << std::endl;
return 0;
}
#endif

Составлено с:

clang++ main.cpp -std=c++14 -D __MAIN__="fullpath/main.cpp"

Что является причиной этой ошибки и как я могу решить мою проблему?

0

Решение

#if а также #endif являются препроцессор директивы — препроцессор выполняется как часть шага компиляции, но он не знает о C ++ как о языке.

Вы не можете смешивать и сопоставлять препроцессор с такими функциями C ++, как constexpr функции.

Если вы хотите, чтобы это работало, вам нужно реализовать свой собственный #define EQUALS макрос, который полностью проверяет равенство строк на этапе предварительной обработки. Я не уверен, возможно ли это (и стоит ли это).

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector