Ich programmiere in einer "Hochsprache" (Nim), und ich muss aus Leistungsgründen auf "C" gehen. Ich möchte so etwas wie dies tun:Wie rufe ich eine C-Funktion auf, die nur in bestimmten Betriebssystemversionen verfügbar ist?
/* Pseudocode */
include <VersionHelpers.h>
/* ...*/
if (isWindows8OrGreater()) {
/** use InterlockedIncrementNoFence64() */
} else {
/** use InterlockedIncrement64() ;(*/
}
Aber mir wurde gesagt, es 7 unter Windows abstürzen würde, denn wenn ich InterlockedIncrementNoFence64 Referenz(), es verfügbar sein muß, auch wenn ich nicht versuchen, es zu nennen .
Ich schreibe eine Multi-Thread-App, und die Kommunikation wird mit "Nachrichten" (sogar innerhalb des gleichen Threads) implementiert. Dies wird für jede Nachricht aufgerufen, sodass ein Memory Fence erhebliche Auswirkungen auf die Leistung hat.
Ich bin zu Java verwendet, wo Dinge wie diese Arbeit, und IDK, wie dies in C erfolgt
Führen Sie die entsprechenden Prüfungen zur Kompilierungszeit durch, indem Sie Preprozessor-Makros verwenden, die nicht zur Laufzeit mit Funktionen arbeiten. – alk
Sie meinen also, die Lösung besteht darin, verschiedene Versionen basierend auf dem Ziel-Betriebssystem zu erstellen? Wenn dies der richtige Weg ist, warum posten Sie es nicht als Antwort? –
Verwenden Sie die [Linker-Unterstützung für verzögerungsgeladene DLLs] (https://msdn.microsoft.com/en-us/library/151kt790.aspx). Es müssen keine verschiedenen Versionen erstellt werden, und es wird berichtet, dass Sie einen Fehler beim Auflösen eines Imports zur Verbindungszeit nicht beheben können.Seien Sie immer skeptisch, wenn ein Linux-Entwickler Lösungen zum Linken in Windows vorschlägt. Sie sind im Allgemeinen falsch (wie in diesem Fall). – IInspectable