首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux中获得函数参数(C++)的未声明标识符错误,但在Windows中未得到

在Linux中获得函数参数(C++)的未声明标识符错误,但在Windows中未得到
EN

Stack Overflow用户
提问于 2020-10-22 13:19:34
回答 1查看 617关注 0票数 0

我写了这些代码:

代码语言:javascript
复制
#include <iostream>
#include <limits>
#include <string>
#ifdef _WIN32
  #include "WinSock2.h"
  #include "WS2tcpip.h"

  #pragma comment(lib,"ws2_32.lib")

#elif __linux__
  #include <sys/socket.h>
  #include <arpa/inet.h>
  #define SOCKET socket
#else
  #error Compiler cannot interpret platform. Please compile this program in Windows 32/64-bit or Linux!
#endif

//...some codes here for initalization for _WIN32

int socket_create(SOCKET &socketHandler)
{
  socketHandler = socket(AF_INET, SOCK_STREAM, 0);

  if (socketHandler == INVALID_SOCKET)
  {
    #ifdef _WIN32
      return (WSAGetLastError());
    #else
      return -1;
    #endif
  }
  else
  {
    return 0;
  }
}

//...some codes for other functions
//...main function

在带参数的Windows 10 x64上使用Clang11.0.0编译时:

clang server.cpp -Wall -Wextra -std=c++17 -g -glldb -lws2_32 -fexceptions -O0 -o目标\debug\win-amd64 64\server.exe-fms-兼容性-m64

完美无缺。这个程序在没有警告的情况下编译,并且运行得很完美。但是,将其直接应用于linux (Ubuntu20.04 x64,安装了clang-11和libc++-dev &libc++abi),并在其中使用Clang11.0.0编译,其中包含参数:

clang-11 server.cpp -Wall -Wextra -std=c++17 -g -glldb -fexceptions -O0 -o目标\deb\deb-amd64 64\server.exe -m64

它给了我这个错误:

代码语言:javascript
复制
error: use of undeclared identifier 'socketHandler'
int socket_create(SOCKET &socketHandler)
                          ^

代码语言:javascript
复制
error: expected ';' after top level declarator
int socket_create(SOCKET &socketHandler)
                                        ^

问:为什么Linux有不同之处?我是不是漏掉了什么宣言?如果是这样的话,Windows中相同版本的clang如何能够很好地编译它,而在Linux中直接拒绝呢?TBH,这是我第一次在Linux中编译东西,所以我不知道我是否错过了一些在Linux中应该做的事情,而不是在WindowsforC++中做的事情。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-22 13:25:52

Linux中的socket()返回的是int,而不是socketSOCKET

您在Linux模式下使用的是#define SOCKET socket,它会让它将函数名放在需要类型名称的地方,如下所示:

代码语言:javascript
复制
int hoge(){ return 0; }

int fuga(hoge& x) { // error
    return 0;
}

此错误不是在Windows中产生的,因为问题行#define SOCKET socket没有在Windows中使用,这要归功于#ifdef指令。

总之,行#define SOCKET socket应该是typedef int SOCKET;

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64483167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档