用 C、C++ 检测 Windows 或 Linux [重复]

2024-03-27

我正在编写一个跨平台程序。我希望这个程序能够在 Windows 和 Linux 下运行,因此我为这两个平台准备了两个不同的代码段。如果操作系统是Windows,我希望第一个代码段运行;如果是Linux,那么我希望运行第二个代码段。

所以我编写了以下代码,但在 Windows 和 Linux 上构建时都会出错。我应该怎么做才能解决它?

#ifdef __unix__                    /* __unix__ is usually defined by compilers targeting Unix systems */

    #define OS_Windows 0
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>

#elif defined(_WIN32) || defined(WIN32)     /* _Win32 is usually defined by compilers targeting 32 or   64 bit Windows systems */

    #define OS_Windows 1
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    #define DIV 1048576
    #define WIDTH 7

#endif

int main(int argc, char *argv[])
{
    if(OS_Windows)
    {
        MEMORYSTATUSEX statex;
        statex.dwLength = sizeof (statex);
        GlobalMemoryStatusEx (&statex);

        _tprintf (TEXT("There is  %*ld %% of memory in use.\n"),
                    WIDTH, statex.dwMemoryLoad);

    }

    else if(!OS_Windows) // if OS is unix

    {
        char cmd[30];
        int flag = 0;
        FILE *fp;
        char line[130];
        int memTotal, memFree, memUsed;

        flag=0;
        memcpy (cmd,"\0",30);
        sprintf(cmd,"free -t -m|grep Total");
        fp = popen(cmd, "r");
        while ( fgets( line, sizeof line, fp))
        {
            flag++;
            sscanf(line,"%*s %d %d %d",&TotalMem, &TotalUsed, &TotalFree);
        }
        pclose(fp);

        if(flag)
            printf("TotalMem:%d -- TotalUsed:%d -- TotalFree:%d\n",TotalMem,TotalUsed,TotalFree);
        else
            printf("not found\n");

    }

    return 0;
}

通常是这样完成的(或多或少):

#ifdef _WIN32
#include <windows.h>
#include <stdio.h>
#include <tchar.h>

#define DIV 1048576 
#define WIDTH 7
#endif

#ifdef linux
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#endif


int main(int argc, char *argv[]) 
{
#ifdef _WIN32
MEMORYSTATUSEX statex;
    statex.dwLength = sizeof (statex);
    GlobalMemoryStatusEx (&statex);

    _tprintf (TEXT("There is  %*ld %% of memory in use.\n"),
            WIDTH, statex.dwMemoryLoad);
#endif

#ifdef linux
char cmd[30];
int flag = 0;   
FILE *fp;
char line[130];     
int TotalMem, TotalFree, TotalUsed;

flag=0;
memcpy (cmd,"\0",30);
sprintf(cmd,"free -t -m|grep Total");          
fp = popen(cmd, "r");       
while ( fgets( line, sizeof line, fp))
{   
    flag++;
    sscanf(line,"%*s %d %d %d",&TotalMem, &TotalUsed, &TotalFree);
}
pclose(fp); 

if(flag)
    printf("TotalMem:%d -- TotalUsed:%d -- TotalFree:%d\n",TotalMem,TotalUsed,TotalFree);
else 
    printf("not found\n");
#endif

    return 0;
}

这样,在linux平台上只会编译linux的代码,在windows平台上只会编译windows的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 C、C++ 检测 Windows 或 Linux [重复] 的相关文章

随机推荐

  • D3.js V4 和 Angular 不会发生节点转换

    我在用角度打字稿 with D3 js V 4 12我特别使用整齐的径向树 https bl ocks org mbostock 4063550用于代表产品 初始步骤 随着ng cli 我安装了npm install save d3并创建了
  • SharedKeyCredential 不是构造函数。 Azure存储反应应用程序

    我正在尝试使用以下代码将 blockblob 上传到反应应用程序中的 Azure 存储 但是 我收到以下错误 类型错误 SharedKeyCredential 不是构造函数 有任何想法吗 azure 电子邮件受保护 cdn cgi l em
  • MVC 捆绑包和 IIS 虚拟目录(URL 重写)

    我在 IIS 服务器虚拟目录上托管多个应用程序 并使用 URL 重写来简化它们 所有图像和其他资产都是这样手动编写的 path to my content 有正确的输出 path to my content 但捆绑路径如 client js
  • 金钱图能很好地流动吗?

    sql 数据类型 Money 是否映射到 C float 不 它映射到decimal 如果该列允许 null 则它映射到Nullable
  • 将 ASP.NET 应用程序迁移到 IIS7 时出现注册表访问错误

    我正在运行 Windows 7 64 位和 iis7 我正在尝试在 XP 上设置一个以前在 iis6 中的 Web 应用程序 它给了我下面的错误 我已将网络服务用户添加到性能监视器用户组中 但无济于事 对注册表项 Global 的访问是 否
  • 如何通过Java Validator消息传递参数?

    目前 我有类似的东西 NotNull message err required Size min 1 message err required private String firstName In my messages properti
  • bean 验证获取验证组

    是否可以获取调用验证方法的验证器中的组 我有多个组 创建 更新 删除 它们大多数会导致对一个 bean 进行类似的验证 我不想提供多个几乎相同的验证器 并创建实用程序函数来外部化相同的验证代码 我更愿意有一个验证器来处理有关调用验证的组的验
  • graphviz 绘图太宽

    我正在做练习 在 jupyter 笔记本中使用 graphviz 创建决策树 然而 决策树过于宽泛 这是代码 from sklearn tree import export graphviz export graphviz tree out
  • 保存 .php 文件并保存包含内容(可能)

    设置 我有一个标准 php 文件 index php 其中包含两个包含内容 一个用于页眉 header php 一个用于页脚 footer php index php 文件如下所示 索引 php h2 Hello h2 p class ed
  • 检查 Windows C/C++ 中的文件夹/文件是否隐藏/系统

    我正在使用 C STL Boost 编写一个跨平台应用程序 我意识到它们没有提供一种方法来检查文件夹或文件是否隐藏或者是 Windows 中的系统文件 在 Windows 的 C C 中执行此操作的最简单方法是什么 理想情况下 我有一个带有
  • 从 python Fabric 执行远程 bash 命令时“转义”$

    所以我尝试通过 python Fabric 脚本自动设置 arch linux 实例 如下所示 from fabric api import run sudo def server setup communityrepo run echo
  • mingw 应用程序中的清单被忽略

    我有一个老式的 Windows GDI 应用程序 用 C 编写 正在使用 Mingw 工具链进行编译 我的一些用户一直在抱怨 Windows Vista 和 Windows 7 的虚拟存储 其中写入应用程序不应访问的目录的文件会被抽走并存储
  • 可以在 UIWebView 中使用 iframe 吗?

    我想在我的应用程序中添加一个类似 facebook 的按钮 在developer facebook com 中我对此无能为力 是否可以在 UIWebView 中使用 facebook 创建的 iframe 之类的按钮 它认为如果可能的话我可
  • Android Studio 模拟器不断冻结、崩溃并且根本没有响应

    我是一名 Android 开发新手 最近遇到了一些问题 我不知道这是我的硬件问题还是 Android Studio 的问题 但模拟器一直冻结或没有响应 前 2 天 Android Studio 运行良好 但是 之后它无法运行我的应用程序 我
  • 使用python 3.7创建pipenv虚拟环境时出错

    我的操作系统是 ubuntu 20 04 默认的 python 是 3 8 2 我正在尝试使用 Pipenv 和 python 3 7 创建一个虚拟环境 当我运行时出现以下错误pipenv install python 3 7 Creati
  • C++ 将时间字符串转换为纪元的秒数

    我有一个具有以下格式的字符串 2010 11 04T23 23 01Z Z 表示时间为 UTC 我宁愿将其存储为纪元时间 以便于比较 推荐的方法是什么 目前 经过快速搜索 最简单的算法是 1
  • Google App Engine 中的 Spring Boot 应用程序无法连接到 Cloud SQL

    我不确定我还缺少什么 但我的应用程序一开始就失败了 Message The connection attempt failed at org flywaydb core internal jdbc JdbcUtils openConnect
  • 可以使用reduceBykey来更改类型和组合值-Scala Spark吗?

    在下面的代码中 我尝试组合值 val rdd org apache spark rdd RDD String Double sc parallelize List a 1 0 a 3 0 a 2 0 val reduceByKey rdd
  • SQL:HAVING 子句

    请看下面的SQL语句 SELECT datediff d MAX invoice date Now As Date Diff MAX invoice date AS max invoice date customer number AS c
  • 用 C、C++ 检测 Windows 或 Linux [重复]

    这个问题在这里已经有答案了 我正在编写一个跨平台程序 我希望这个程序能够在 Windows 和 Linux 下运行 因此我为这两个平台准备了两个不同的代码段 如果操作系统是Windows 我希望第一个代码段运行 如果是Linux 那么我希望