You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C/C++调用sysinfo报无存储类或类型说明符编译错误

错误原因

C/C++ 语法规定:全局作用域(所有函数外部的代码区域)仅允许编写变量声明、常量/变量初始化相关的语句,所有可执行逻辑(包括函数调用、算术赋值运算等)必须写在函数内部。
你当前的代码把sysinfo(&memInfo);函数调用、后续totalVirtualMem的累加/乘法运算都直接写在了全局作用域,编译器无法将这些执行语句识别为合法的全局声明,就会抛出给定的类型/存储类不匹配错误。
注意:你当前代码里不止sysinfo(&memInfo);这一行有问题,后面几行对totalVirtualMem的赋值运算同样属于执行语句,放在全局域也会触发同类报错。
额外编码规范提示:Linux 系统头文件建议用尖括号<>包含,双引号""一般用于引入项目自定义头文件,能避免头文件搜索优先级导致的异常。

修复方案

把所有执行逻辑移入函数内部,最简单的方式是放入main函数,如果要封装为独立的工具函数,也可以放到自定义函数中。修正后的可编译基础代码如下:

#include <sys/types.h>
#include <sys/sysinfo.h>

int main() {
    struct sysinfo memInfo;
    sysinfo(&memInfo);
    long long totalVirtualMem = memInfo.totalram;
    // 逐次累加避免右侧运算整数溢出
    totalVirtualMem += memInfo.totalswap;
    totalVirtualMem *= memInfo.mem_unit;

    // 此处编写后续使用内存数据的业务逻辑
    return 0;
}

如果需要封装为可复用的获取内存数据的函数,也可以按如下方式实现:

#include <sys/types.h>
#include <sys/sysinfo.h>

long long get_total_virtual_mem() {
    struct sysinfo memInfo;
    sysinfo(&memInfo);
    long long totalVirtualMem = memInfo.totalram;
    totalVirtualMem += memInfo.totalswap;
    totalVirtualMem *= memInfo.mem_unit;
    return totalVirtualMem;
}

int main() {
    long long total_vm = get_total_virtual_mem();
    // 业务逻辑
    return 0;
}

内容的提问来源于stack exchange,提问作者scriptKiddie123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:39:32