【发布时间】:2020-04-02 09:59:59
【问题描述】:
我正在尝试通过调用 uname 系统调用来获取 Linux 内核版本信息,但是我收到了一个编译器错误提示 ‘struct utsname’ has no member named ‘domainname’
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/utsname.h>
#define _GNU_SOURCE
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;
}
根据https://linux.die.net/man/2/uname struct utsname 是
struct utsname {
char sysname[]; /* Operating system name (e.g., "Linux") */
char nodename[]; /* Name within "some implementation-defined
network" */
char release[]; /* Operating system release (e.g., "2.6.28") */
char version[]; /* Operating system version */
char machine[]; /* Hardware identifier */
#ifdef _GNU_SOURCE
char domainname[]; /* NIS or YP domain name */
#endif
};
我不确定我在这里错过了什么
【问题讨论】:
-
预处理器的工作在处理代码时是一种严格的自上而下的方式,这意味着顺序很重要。如果您在定义宏之前
#include一个头文件,那么将不会为包含的头文件定义宏。 -
除了@SPD,您还可以编译启用宏:
gcc -D_GNU_SOURCE=1 test.c -o test.exe。您可能还可以获得使用gcc -std=gnu99 test.c -o test.exe定义的宏。另请参阅 _GNU_SOURCE and __USE_GNU 和 Should I still define _GNU_SOURCE when I compile with -std=gnu99? 等问题