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

已定义_GNU_SOURCE仍无法访问utsname结构体的domainname成员

Fixing "‘struct utsname’ has no member named ‘domainname’" Compilation Error

你遇到的问题根源其实很直白——#define _GNU_SOURCE的位置放错了。

C预处理器是按代码顺序逐行处理的,你把这个宏定义写在了#include <sys/utsname.h>之后,导致编译器处理sys/utsname.h时,_GNU_SOURCE还没被定义,头文件里的domainname成员自然不会被包含进struct utsname的定义里。

按照GNU扩展的规则,这类启用扩展功能的宏必须在包含任何相关头文件之前定义,这样头文件才能识别到宏并解锁对应的扩展内容。

修正后的代码

#define _GNU_SOURCE  // 必须放在所有#include语句之前
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/utsname.h>

int main(void) {
    struct utsname buffer;
    errno = 0;
    if (uname(&buffer) != 0) {
        perror("uname");
        exit(EXIT_FAILURE);
    }
    printf("system name = %s\n", buffer.sysname);
    printf("node name = %s\n", buffer.nodename);
    printf("release = %s\n", buffer.release);
    printf("version = %s\n", buffer.version);
    printf("machine = %s\n", buffer.machine);
#ifdef _GNU_SOURCE
    printf("domain name = %s\n", buffer.domainname);
#endif
    return EXIT_SUCCESS;
}

额外小技巧

如果你用GCC编译,也可以通过编译选项直接定义这个宏,不用在代码里写#define:

gcc your_code.c -o your_program -D_GNU_SOURCE

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:56:12