gcc SO_DOMAIN不使用-std= c2 x进行编译

jdg4fx2g  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(166)

今天我重新看了我的老代码。代码使用socketgetsockopt调用。我修改了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编译器开关时,它确实找到了定义。

s4n0splo

s4n0splo1#

-std=c2x不是“默认的,但是有C23特性”。这是因为默认的是GNU C版本之一,比如gnu17(它使用哪一年取决于你的GCC版本)。你以前用-std=gnu17编译过,而不是-std=c17。切换到-std=c2x确实给予了你C23特性,但是拿走了(一些)GNU扩展。
正如Jonathan Leffler所评论的,解决方案是使用-std=gnu2x,它保留了您所依赖的GNU扩展。

相关问题