Я пишу простой файл сборки с помощью 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"
Что является причиной этой ошибки и как я могу решить мою проблему?
#if
а также #endif
являются препроцессор директивы — препроцессор выполняется как часть шага компиляции, но он не знает о C ++ как о языке.
Вы не можете смешивать и сопоставлять препроцессор с такими функциями C ++, как constexpr
функции.
Если вы хотите, чтобы это работало, вам нужно реализовать свой собственный #define EQUALS
макрос, который полностью проверяет равенство строк на этапе предварительной обработки. Я не уверен, возможно ли это (и стоит ли это).
Других решений пока нет …