Это немного расплывчато. Бинарный файл не будет работать в обеих системах, если вы не запустите Wine (см. http://wiki.winehq.org/DeveloperFaq#detect-wine).
Во время компиляции вы можете проверить #define, специфичные для Windows или Linux, но, возможно, это компилятор и поддерживаемый стандарт, поэтому я не уверен, что вам разрешено делать это для целей (т. е., возможно, там есть ваша «нет специальных функций заголовков, используемых для проверки»).
В целом, я не думаю, что имеет смысл делать предпочтения для проверки времени компиляции, и это может не работать под Wine, но вы можете использовать dlsym()
, чтобы проверить себя на символы, которые, как известно, присутствуют только на одном операционных систем, или посмотрите на свой собственный исполняемый файл, чтобы узнать, что это такое.
Практически также очень вероятно, что вы можете проверить переменные окружения и сделать достаточно хорошее определение, основанное на этом, хотя кто-то может умышленно обмануть вашу программу в неверную оценку или ваш метод определения может сломаться в будущих версиях операционных систем, под разными оболочками и т. д.
Во время выполнения вы могли бы, например, stat("/dev", &buf)
, который должен работать только в Linux. Попытка popen
(3) сказать, что uname
- еще один правдоподобный подход: вы сможете прочитать «linux \ n», если вы находитесь на Linux, а в среде cygwin apparently reports NT
, see here too.
как это? Http: // StackOverflow.com/questions/5919996/how-to-detect-reliably-mac-os-x-ios-linux-windows-in-c-preprocessor – chris
эти вопросы говорят о макросах, но я думаю, что OP действительно спрашивает, d сделать это с кодом, который вы могли бы скомпилировать на нескольких платформах. Я бы предложил проверить файловую систему на наличие файлов, которые показали операционную систему. –
Концептуально, вероятно, было бы разумнее решить эту проблему на уровне среды сборки вместо уровня языка. То есть чтобы среда сборки определяла флаг препроцессора, который позволяет коду определять платформу. В противном случае вы вводите информацию о компиляторе в источник, который ограничивает переносимость и не так хорош в целом. – ComicSansMS