Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

[C++] Kod zależny od systemu

Zdarzyło się wam kiedyś programować aplikację na kilka platform?

Programowanie na platformach Linux i Windows różni się znacznie. Szczególnie patrząc na wątki pod tymi systemami, komendy dla funkcji system(), a szczególnie funkcje będące częścią plików nagłówkowych tych systemów.

Tworzenie dwóch plików z kodem i modyfikacja kolejnych partii kodu dla obydwu systemów jest możliwą metodą, ale nie dobrą na dłuższą metę, kiedy wasza aplikacja się rozrośnie, a zmiany trzeba będzie cały czas przenosić pomiędzy plikami. Jednak istnieje na to sposób, a dokładniej dyrektywy dla preprocesora kodu.

r   e   k   l   a   m   a

Co to Preprocesor?

Jest to swojego rodzaju narzędzie do "przeczytania" kodu przed kompilacją. Działa to na zasadzie wczytania tych dyrektyw kodu, które są prawidłowe dla danej platformy, bądź sprawiają, że możemy użyć funkcji z danego pliku nagłówkowego.

Przykładowa dyrektywa dla preprocesora kodu to:


#include <iostream>

Sprawia ona, że przed kompilacją w kod naszej aplikacji zostaną "dodane" instrukcje, które znajdują się w pliku nagłówkowym "iostream".

Istnieje możliwość wykrycia platformy na której odbywa się kompilacja dzięki odpowiedniej dyrektywie.

Owa instrukcja to "#ifdef", która jest zwana również dyrektywą warunkową, ponieważ ingeruje w kod programu i sprawia, że kompiluje się on w odpowiednich warunkach.

Przykładowe wykrycie systemu:


#ifdef WIN32
// kod brany pod uwagę w przypadku
// wykrycia platformy systemu Windows
#else
// kod, który zostanie użyty w przypadku braku zgodności
// obecnego środowiska z platformą "WIN32"
#endif

Wszyscy dobrze znamy instrukcje warunkową "if". Ta jej wersja jest brana pod uwagę jeszcze przed kompilacją kodu, czyli wtedy kiedy preprocesor przygotowuje kod do kompilacji.
"#ifdef WIN32" sprawdza zgodność platformy na której odbywa się kompilacja z "WIN32", w przypadku zgodności z tą platformą jest wykonywany kod od "#ifdef WIN32" do "#else". Natomiast kiedy nie będzie zgodności instrukcje będą wzięte z przedziału "#else" do "#endif".

Istnieje również możliwość sprawdzenia bez konieczności definiowania tego co ma się stać w przypadku niezgodności. Można to zrobić tak:


#ifdef WIN32
// kod brany pod uwagę tylko 
// w przypadku zgodności z platformą "WIN32"
#endif

Jak widać w C++ nie trzeba wcale męczyć się z kilkoma plikami z kodem, lecz użyć prostej dyrektywy preprocesora, która sprawi, że jeden plik kodu będzie odbierany inaczej na systemie Linux oraz Windows.

Przykładowy kod, który może jeszcze bardziej rozjaśnić temat dyrektyw preprocesora:


#include <iostream>
#include <stdio.h>

using namespace std;

#ifdef WIN32

#include <windows.h>
int nFoo = 1;

#else

#include <unistd.h>
int nFoo = 2;

#endif

int main()
{
cout << nFoo << endl;

#ifdef WIN32
Sleep(1000); // zamrozenie watku na sekunde - funkcja z "windows.h"
#else
sleep(1); // to samo - funkcja z "unistd.h"
#endif

cout << endl; // pusta linijka
cout << "Nacisnij ENTER aby WYJSC...";
getchar();

return 0;
}

Powyższy kod nie da nam błędu kompilacji na systemie Linux z powodu braku funkcji "Sleep()", a przywita nas liczbą "2" na ekranie konsoli. W przypadku systemu Windows będzie to "1".

Mam nadzieje, że przybliżyłem wam temat pisania kodu zależnego od platformy na której się go kompiluje.

Oczywiście oprócz "WIN32" istnieją również inne identyfikatory systemów i platform.
Pełna lista dostępna jest pod tym adresem:
http://predef.sourceforge.net/preos.html  

Komentarze