簡體   English   中英

當我為 linux 和 windows 編寫代碼時,如何正確構建我的文件

[英]How do is structure my files right, when I write code for linux and windows

我目前不確定我應該如何最好地分離我的代碼。 我目前正在編寫一個應該在 Linux 和 Windows 上運行的軟件。 所以我決定將所有操作系統相關的東西放在他們自己的文件夾/文件中。

例如這是頭文件:

#ifdef __linux__
#include <unistd.h>
#elif _WIN64
#include <Windows.h>
#endif
#include <string>
#include <iostream>


#pragma once

class SystemTools
{
public:
    // Delay in secounds until the programm continues
    static void sleep(int delay);


private:
};

操作系統特定的實現位於 linux/windows 文件夾 Linux 中:

#ifdef __linux__
#include "../SystemTools.h"

void SystemTools::sleep(int delay)
{
    usleep(delay*1000000);
}
#endif

視窗:

#ifdef _WIN64
#include "../SystemTools.h"

void SystemTools::sleep(int delay)
{
    Sleep(delay*1000);
}

#endif

這有效,到目前為止我沒有問題,但是當我現在擁有不需要任何操作系統特定代碼的方法時,我創建了一個額外的文件夾“Generic”,這樣我就可以在那里編寫代碼而不必維護相同的linux 和 windows 文件中的代碼。 例如像這樣:

通用的:

#include "../SystemTools.h"

void SystemTools::sleepMin(int delay)
{
    sleep(delay*60);
}

#endif

這仍然適用於 Linux,但不適用於 Windows(沒有錯誤但無法編譯,在 Windows 上使用了代碼塊)。 那么我該如何正確組織我的代碼呢? 即使它變得非常丑陋,我是否應該只使用一個帶有 ifdef 的文件?

(編譯器Linux:g++,Windows:應該是MinGW)

首先,我建議您在項目中使用最新的 C++(C++20 左右)。 通過這種方式,我們可以抽象出許多與操作系統相關的調用(如線程、同步、隨機數等)。

這意味着,您實際上不需要使用太多特定於操作系統的 API。 IE:C++11 及更早版本已經有標准的睡眠方式:

https://en.cppreference.com/w/cpp/thread/sleep_for

最后,如果你真的需要在 windows 和 linux 上調用操作系統特定的東西,使用庫可能會很有趣,並注意 windows C++ 編譯器(visual studio)真的很喜歡使用“預編譯頭文件”,所以很有趣有一個頭文件,其中可以包含所有 Windows 特定的頭文件。

基本上就是這樣。 您可以為您的 linux 構建使用標准的 Cmake 或 makefile,並使用 .sln Visual Studio 項目將其構建到 Windows。

這就是我會這樣做的方式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM