visual - vs code new class c++




Plattformübergreifenden C++-Code schreiben(Windows, Linux und Mac OSX) (4)

Anstatt sich zu wiederholen und immer wieder die gleichen #ifdef .... -Zeilen zu schreiben, ist es vielleicht besser, die probe () -Methode in einem Header zu deklarieren und drei verschiedene Quelldateien bereitzustellen, eine für jede Plattform. Dies hat auch den Vorteil, dass Sie beim Hinzufügen einer Plattform nicht alle vorhandenen Quellen ändern, sondern nur neue Dateien hinzufügen müssen. Verwenden Sie Ihr Build-System, um die entsprechende Quelldatei auszuwählen.

Beispielstruktur:

include/probe.h
src/arch/win32/probe.cpp
src/arch/linux/probe.cpp
src/arch/mac/probe.cpp

Die Warnung ist, weil probe () keinen Wert zurückgibt. Mit anderen Worten, keiner der drei #ifdefs stimmt überein.

Dies ist mein erster Versuch, etwas zu schreiben, das in C ++ etwas komplizierter ist. Ich versuche, eine gemeinsam genutzte Bibliothek zu erstellen, mit der ich über Objective-C und .NET-Apps kommunizieren kann (ok, dieser Teil kommt später ...).

Der Code, den ich habe, ist -

#ifdef TARGET_OS_MAC
  // Mac Includes Here
#endif

#ifdef __linux__
  // Linux Includes Here
  #error Can't be compiled on Linux yet
#endif

#ifdef _WIN32 || _WIN64
  // Windows Includes Here
  #error Can't be compiled on Windows yet
#endif

#include <iostream>

using namespace std;

bool probe(){
  #ifdef TARGET_OS_MAC
    return probe_macosx();
  #endif
  #ifdef __linux__
    return probe_linux();
  #endif
  #ifdef _WIN32 || _WIN64
    return probe_win();
  #endif
}

bool probe_win(){
  // Windows Probe Code Here
  return true;
}

int main(){

  return 1;
}

Ich habe eine Compiler-Warnung, die einfach untitled: In function 'bool probe()':untitled:29: warning: control reaches end of non-void function - aber ich wäre auch sehr dankbar für Informationen oder Ressourcen, die die Leute dazu vorschlagen könnten Schreiben Sie diese Art von Code besser ....


Die Warnung liegt daran, dass Sie in Ihrer Testfunktion keine return haben, wenn keine der Definitionen tatsächlich definiert ist. Das Update dafür wird in eine Standardrendite gestellt.



TARGET_OS_MAC , __linux__ , _WIN32 oder _WIN64 zum Zeitpunkt der _WIN32 noch _WIN64 definiert zu sein.

Ihr Code war also wie folgt:

bool probe(){
}

Deshalb beschwert sich der Compiler über das Erreichen des Endes einer Non-Void-Funktion. Es gibt keine return .

Für die allgemeinere Frage sind hier meine Richtlinien für die Entwicklung von Multiplattform- / Architektur-Software / Bibliotheken:

Vermeiden Sie Sonderfälle. Versuchen Sie, einen Code zu schreiben, der OS-unabhängig ist.

Versuchen Sie beim Umgang mit systemspezifischen Dingen, Dinge in "undurchsichtige" Klassen zu packen. Wenn Sie sich beispielsweise mit Dateien befassen (verschiedene APIs unter Linux und Windows), versuchen Sie, eine File Klasse zu erstellen, die die gesamte Logik einbettet und unabhängig vom Betriebssystem eine gemeinsame Schnittstelle bereitstellt. Wenn eine Funktion auf einem der Betriebssysteme nicht verfügbar ist, beheben Sie diese: Wenn die Funktion für ein bestimmtes Betriebssystem keinen Sinn ergibt, ist es häufig in Ordnung, überhaupt nichts zu tun.

Kurz gesagt: #ifdef weniger #ifdef besser. Und egal wie portabel Ihr Code ist, testen Sie ihn auf jeder Plattform, bevor Sie ihn veröffentlichen.

Viel Glück ;)





cross-platform