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

为何sys/types.h未包含major(dev_t dev)定义?编译报错‘major未声明’

问题

调用major(st_dev)时触发编译错误:‘major’ was not declared in this scope。查阅Linux man page 3文档,显示<sys/types.h>应包含major(dev_t dev)的定义,但在Linux 5.10.76-linuxkit系统的/usr/include/sys/types.h中未找到该定义,询问为何该头文件未按文档包含该定义?

附man页片段

major(3) - Linux man page
Name
makedev, major, minor - manage a device number
Synopsis
#define BSD_SOURCE               /* See feature test macros(7) */
#include <sys/types.h>
dev_t makedev(int maj, int min);
unsigned int major(dev_t dev);
unsigned int minor(dev_t dev);
Description

代码片段

#include <vector>
#include <map>
#include <iostream>
#include <fstream>
#include <string>
#include <stdint.h>
#include <cstring>
#include <unistd.h>
#include <sys/stat.h>

major(statbuf.st_dev);
解答
  • 核心原因:特性测试宏未启用
    从你提供的man页片段可以明确看到,major()这类函数属于BSD兼容接口,必须先定义BSD_SOURCE(部分新版本系统需用_BSD_SOURCE)特性测试宏,<sys/types.h>才会暴露这些函数的定义。Linux系统的头文件默认不会开启这类兼容接口,所以直接包含头文件找不到函数声明。

  • 解决办法

    1. 在代码中提前定义宏:在包含任何头文件之前添加宏定义,确保接口被启用:
      #define _BSD_SOURCE
      #include <sys/types.h>
      // 其余头文件...
      
      部分新系统也支持用_DEFAULT_SOURCE替代,它会包含大部分常用的兼容接口定义。
    2. 编译时通过参数定义宏:用GCC编译时,直接在命令行传入宏定义参数:
      gcc -D_BSD_SOURCE your_code.cpp -o your_program
      
    3. 改用内核标准头文件:Linux内核提供了<sys/sysmacros.h>,其中直接包含major()和minor()的定义,无需额外定义宏,直接包含即可:
      #include <sys/sysmacros.h>
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:24:28