Обычно для условной компиляции используются предопределенные препроцессоры __linux__
и __apple__
, например:
#if defined(__linux__)
inline void foo() {
// Linux-specific implementation
}
#endif
#if defined(__apple__)
inline void foo() {
// macOS-specific implementation
}
#endif
int main() {}
Однако, если я скомпилирую его с помощью clang main.cpp
, особенно в случае кросс-компиляции, как компилятор узнает, какой препроцессор должен быть предопределен? __linux__
или __apple__
?
Я не указываю целевую платформу в команде компиляции. Откуда компилятор узнает, какая платформа мне нужна?
Я не понимаю вопрос. Компилятор ничего не «знает», компилятор был/настроен на компиляцию для конкретной платформы.
У Clang есть целевая платформа по умолчанию, которую вы выбираете при создании самого Clang. Вы можете увидеть ее в clang --version
и переопределить с помощью clang --target=??
.
@HolyBlackCat, даже если бы я указал --target=x86_64
, это все равно может быть для macOS, а не для Linux.
Я удивлен, что --target=x86_64
это вообще законно (думаю, это для голого металла?). Обычно они выглядят так: x86_64-pc-linux-gnu
(мой настольный Linux), x86_64-w64-windows-gnu
(MSYS2 MinGW) и т. д.
Обычно компилятор знает платформу, на которую он компилируется, и целевая архитектура ясна компилятору, он автоматически передает определенные макросы в препроцессор, как если бы они были включены в качестве параметров -D
в командной строке или в файле специальных определений. был вставлен в начало исходного кода (словно это означает, что вы не указываете эти параметры в командной строке, но компилятор ведет себя так, как если бы эти параметры были указаны в начале файла)
Обычно у вас есть возможность разрешить компилятору отображать весь набор автоматических определений макросов, которые он добавляет в модуль компиляции перед предварительной обработкой.
Компилятор знает, для какой платформы он компилируется.