今天我重新看了我的老代码。代码使用socket
和getsockopt
调用。我修改了makefile
在-std=c2x
下编译以使用现代的C
。奇怪的是getsockopt(fd, SOL_SOCKET, SO_DOMAIN, &domain, &s_len)
的简单行没有编译。
错误是
SO_DOMAIN未声明
根据要求,这里是一个最小的可重复的例子。注意,域返回零。
#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int sd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0);
int domain;
socklen_t s_len;
if(sd < 0){
perror("socket DID NOT create");
return 1;
}
if(getsockopt(sd, SOL_SOCKET, SO_DOMAIN, &domain, &s_len) < 0){
perror("getsockopt failed");
return 2;
}
const char *so_domain = NULL;
if(domain == AF_UNIX)
so_domain = "AF_UNIX";
printf("sock domain is: %d : %s\n", domain, so_domain);
return 0;
}
编译标志为-D_POSIX_VERSION=200809L -D_XOPEN_VERSION=700 -D_XOPEN_UNIX=1
。但如果删除/添加标志,错误仍然存在。
这可能是什么原因呢?
我刚刚注意到,包括任何-std=
标志的gcc
给这个错误。甚至c89
标志错误。我的gcc
版本是
通用计算机规范(Ubuntu 11.3.0 - 1Ubuntu 1~22.04)11.3.0
- 更新**
当我使用-std=gnu2x
编译器开关时,它确实找到了定义。
1条答案
按热度按时间s4n0splo1#
-std=c2x
不是“默认的,但是有C23特性”。这是因为默认的是GNU C版本之一,比如gnu17
(它使用哪一年取决于你的GCC版本)。你以前用-std=gnu17
编译过,而不是-std=c17
。切换到-std=c2x
确实给予了你C23特性,但是拿走了(一些)GNU扩展。正如Jonathan Leffler所评论的,解决方案是使用
-std=gnu2x
,它保留了您所依赖的GNU扩展。