2013-06-18 18 views
5

Potrzebuję funkcji, która może wyczyścić ekran zarówno w systemie Linux, jak i Windows. Aby to zrobić, chcę wiedzieć, czy są jakieś instrukcje, które mogą mi powiedzieć, z jakim systemem operacyjnym pracuję. I Szukano rozwiązania i znalazłem następujący kod:Skąd mogę wiedzieć, w jakim OS pracuje?

void clear_screen() 
{ 
    #ifdef WINDOWS 

    std::system ("CLS"); 

    #else 

    // Assume POSIX 

    std::system("clear"); 

    #endif 
} 

Istnieją dwa problemy związane z tą funkcją:

  • ja tego nie rozumiem.

    -> dla #ifdef WINDOWS, gdzie zdefiniowano WINDOWS?

  • Ten kod działa w systemie Linux, ale nie działa w systemie Windows.

Uwaga:

  • Używam Windows XP.

  • Nie chcę żadnych niestandardowych funkcjonalności ... takie "curses"

Odpowiedz

7

Szukacie

// Windows, all variants (including 64-bit and ARM) 
#ifdef _WIN32 

lub

#ifdef __unix__ 

These są zdefiniowane przez kompilator i nie są przechowywane w pliku nagłówkowym. Z tego powodu nie trzeba do #include pierwszy plik, a te #ifdef s zawsze daje poprawny wynik (chyba, że ​​bałagan z kompilatora)

+3

+1 ale prawdopodobnie powinieneś również zająć się drugą częścią pytania "Gdzie są one zdefiniowane" – jozefg

+1

thx ... ale jest "_WIN32" dla każdej wersji Windows (XP, Vista, 7,8) 32 i 64-bitowe !! – BBeta

+2

@BBeta Tak, jest. –

2

WINDOWS jest zdefiniowany przez kompilator, więc to może być kompilator definiuje -zależny. Jest to przydatne, aby skompilować konkretny kod w zależności od systemu operacyjnego.

7

Makra, takie jak _WIN32, __gnu_linux__, __linux__ są zdefiniowane przez odpowiedni kompilator. Możesz znaleźć pełną listę wstępnie zdefiniowanych makr kompilatora here.

_WIN32 jest zdefiniowany dla środowisk 32-bitowych i 64-bitowych systemu Windows.

1

Istnieją różne makra zależne od kompilatora. Niestety, nie są szczególnie użyteczne, ponieważ nie są standaryzowane, a kompilator C dla konkretnego systemu operacyjnego niekoniecznie # definiuje je. Podejrzewam również, że faktycznie naruszają standard C C11 7.1.3.

100% przenośne rozwiązanie, które skompiluje się na wszystkich kompilatorach C, ma na celu stworzenie takiej stałej. Ponieważ C jest językiem skompilowanym, będziesz musiał skompilować swój kod inaczej dla każdego systemu operacyjnego. Po prostu dodaj plik o nazwie os.c, w którym umieścisz odpowiednią #define lub stałą, a następnie połącz ją z programem. Jedyną rzeczą, którą musisz zmienić podczas kompilacji dla innego systemu operacyjnego, jest ścieżka pliku make do twojego specyficznego dla OS os.c.

Powiązane problemy