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
相关产品推荐
相关产品推荐

