Önişlemci makrolarından platform / derleyici nasıl belirlenir?


115

Linux, Windows, Mac OS'de derlenmesi gereken bir çapraz platform kodu yazıyorum. Windows'ta görsel stüdyoyu ve mingw'i desteklemeliyim.

Ortama yerleştirmem gereken bazı platforma özgü kod parçaları var #ifdef .. #endif. Örneğin, buraya win32'ye özel bir kod yerleştirdim:

#ifdef WIN32
#include <windows.h>
#endif

Peki Linux ve Mac OS'yi nasıl tanıyabilirim? Tanımlama isimleri nelerdir (veya vb.) Kullanmalıyım?



Dupe'nin çok daha iyi kabul edilmiş bir cevabı var.
rubenvb

1
Önerilen kopya aynı soru DEĞİLDİR. Bu soru yalnızca işletim sistemini tanımlamayı sorar, oysa bu soru aynı zamanda derleyiciyi tanımlamayı da sorar ki bu çok farklı bir şeydir.
JBentley

@JBentley, yine de kabul edilen cevap derleyicilerden bahsetmiyor ve sadece işletim sistemleri (ve bir "platform") hakkında konuşuyor. Dupe'nin sunduklarına göre korkunç bir cevap olduğundan bahsetmiyorum bile.
rubenvb

1
@rubenvb Sonra diğer soruyu yorum olarak bağlayın. Daha iyi bir cevabı olduğu için, onu kopya yapmaz. Soru, cevapların değil, yinelenen olup olmadığını belirleyen şeydir. Bunu kapatmak, yalnızca sorunun derleyici ile ilgili kısmına, sözde "yinelenen" yanıtın hiçbir zaman cevaplayamayacağı kaliteli bir yanıt almamamızı sağlar.
JBentley

Yanıtlar:


133

For Mac OS :

#ifdef __APPLE__

İçin MinGW Windows üzerinde:

#ifdef __MINGW32__

For Linux :

#ifdef __linux__

Diğer Windows derleyici için, kontrol Konuyu ve bu diğer bazı derleyici ve mimarileri için.


2
__APPLE__OSX ve iOS arasında ayrım yapıyor mu ?
gman

14
__APPLE__hem OS X hem de iOS için ayarlanmıştır. #include <TargetConditionals.h>İçine girebilirsin #ifdef __APPLE__, bu da sana bir TARGET_OS_IPHONE #define.
Ted Mielczarek

2
__MINGW64__mingw64 kullanıldığında da kullanılabilir
çörekler

2
Yana __MINGW64__başvuruda bulunulan, düşünmek _MSC_VERWindows / MSVC değerinde (aynı zamanda MSVC Sürüm kontrol etmek için kullanılabilir) bir söz sahibidir.
ideasman42

Üzgünüm ama bu cevap tüm hesaplarda oldukça yanlış ve soruya cevap bile vermiyor.
rubenvb

59

Bakınız: http://predef.sourceforge.net/index.php

Bu proje, #definesbirçok işletim sistemi, derleyici, dil ve platform standardı ve standart kitaplık için önceden tanımlanmış makul ölçüde kapsamlı bir liste sağlar .


5
1.55 sürümünden itibaren, Predef artık Boost C ++ Kitaplıklarına dahil edilmiştir .
2013

Bunu yayınladığınızda kuralların farklı olduğunu biliyorum, ancak daha alakalı ayrıntılar eklemek için bu gönderiyi düzenlemenizi istemem gerekecek. Şimdi bir gün boyunca bağlantı yalnızca yanıtlar kesinlikle tavsiye edilmez ve size bu gönderiyi kaldırmadan önce kaydetme şansı sunmak istiyorum.
Mick MacCallum

1
Başlıkta belirtildiği gibi soruyu gerçekten yanıtlayan tek cevap bu olduğundan ve soru çok genel ve alakalı olduğundan, onu kaldırmamayı şiddetle tavsiye ediyorum. Ben de buna "yalnızca bağlantı" yanıtı demezdim.
hobb

2
@ 0x7fffffff: Diğer cevapların içeriğini bu cevapta kopyalamanın herhangi biri için ne gibi bir faydası olabilir? Tek bir kesin cevaba sahip olmanın gerçekten önemli olduğuna inanıyorsanız, o zaman belki de böyle bir cevabı kendiniz yaratmalısınız (zor olmamalı: sadece mevcut cevapları mantıklı bir sırayla yapıştırın). Şahsen benim zamanımla yapacak daha iyi işlerim var, ancak bir moderatör olarak açıkça SO sizin için benden daha önemli.
John Bartholomew

47

İşte kullandığım şey:

#ifdef _WIN32 // note the underscore: without it, it's not msdn official!
    // Windows (x64 and x86)
#elif __unix__ // all unices, not all compilers
    // Unix
#elif __linux__
    // linux
#elif __APPLE__
    // Mac OS, not sure if this is covered by __posix__ and/or __unix__ though...
#endif

DÜZENLEME: Yukarıdakiler temel bilgiler için işe yarasa da, Boost.Predef referans sayfalarına bakarak kontrol etmek istediğiniz makroyu doğrulamayı unutmayın . Veya doğrudan Boost.Predef'i kullanın.


4
bunun yerine __linux __ kullanın, linux GCC ile GNU uzantıları devre dışı bırakılırken derlenirken tanımlanmaz (yani -std = c ++ 0x)
Erbureth, Monica

1
@Erbureth Sabit, ancak en yüksek puan alan cevapta olduğu gibi gerçekten predef.sourceforge.net/index.php kullanılmalıdır.
rubenvb

@rubenvb: gerçekten. Ve yine de çok az oy aldı, sanırım :) ... Sitelerine defalarca döndüm.
0xC0000022L

Tutarlılık için (belki biraz bilgiççe): İlki #iftanımlanıp tanımlanmadığını sorar, diğerleri değeri test eder. Yapmak daha tutarlı olsaydı #elif defined(__unix__) vs, bence.
leonbloy

20

C ++ yazıyorsanız, Boost kitaplıklarını yeterince güçlü kullanmanızı tavsiye edemem .

En son sürüm (1.55), düzinelerce başka platform ve mimari tanıma makrosunun yanı sıra tam olarak aradığınız şeyi kapsayan yeni bir Predef kitaplığı içerir .

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#elif BOOST_OS_LINUX

#elif BOOST_OS_MACOS

#endif

Bunun destek olduğu göz önüne alındığında, bu çözüm farklı platformlarda / işletim sistemlerinde VE farklı derleyicilerde çalışacaktır.
Trevor Boyd Smith

3
"Boost kitaplıklarını yeterince güçlü kullanmanızı tavsiye edemem ...." - Boost'u üç kez değerlendirdim. Bir değerlendirmeyi geçemez ... Hata raporlarının çoğu, eğer kabul edildiyse şanslıydı. Onay eksikliği, mühendislik sürecinde daha derin sorunlara işaret eder. Önişlemci makrolarının ve yerleşik C ++ Standart Kitaplıklarının daha güvenli bir seçim olduğuna inanıyorum.
jww
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.