已定义_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
相关产品推荐
相关产品推荐

