Как компилятор предопределяет препроцессоры для конкретной ОС, такие как __linux__, __apple__ и т. д.?

Обычно для условной компиляции используются предопределенные препроцессоры __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__ ?

Компилятор знает, для какой платформы он компилируется.

molbdnilo 13.03.2024 11:01

Я не указываю целевую платформу в команде компиляции. Откуда компилятор узнает, какая платформа мне нужна?

xmllmx 13.03.2024 11:02

Я не понимаю вопрос. Компилятор ничего не «знает», компилятор был/настроен на компиляцию для конкретной платформы.

KamilCuk 13.03.2024 11:06

У Clang есть целевая платформа по умолчанию, которую вы выбираете при создании самого Clang. Вы можете увидеть ее в clang --version и переопределить с помощью clang --target=??.

HolyBlackCat 13.03.2024 11:07

@HolyBlackCat, даже если бы я указал --target=x86_64, это все равно может быть для macOS, а не для Linux.

xmllmx 13.03.2024 11:45

Я удивлен, что --target=x86_64 это вообще законно (думаю, это для голого металла?). Обычно они выглядят так: x86_64-pc-linux-gnu (мой настольный Linux), x86_64-w64-windows-gnu (MSYS2 MinGW) и т. д.

HolyBlackCat 13.03.2024 12:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обычно компилятор знает платформу, на которую он компилируется, и целевая архитектура ясна компилятору, он автоматически передает определенные макросы в препроцессор, как если бы они были включены в качестве параметров -D в командной строке или в файле специальных определений. был вставлен в начало исходного кода (словно это означает, что вы не указываете эти параметры в командной строке, но компилятор ведет себя так, как если бы эти параметры были указаны в начале файла)

Обычно у вас есть возможность разрешить компилятору отображать весь набор автоматических определений макросов, которые он добавляет в модуль компиляции перед предварительной обработкой.

Другие вопросы по теме