Linux 中的函数参数 (C++) 出现未声明的标识符错误,但 Windows 中没有

Got undeclared identifier error for a function argument (C++) in Linux, but not in Windows

我写了这些代码:

#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 上使用 Clang 11.0.0 编译时,参数为:

clang server.cpp -Wall -Wextra -std=c++17 -g -glldb -lws2_32 -fexceptions -O0 -o target\debug\win-amd64\server.exe -fms-compatibility -m64

完美无缺。该程序编译时甚至没有警告,运行 非常完美。 但是,将其直接带到 linux(Ubuntu 20.04 x64,安装了 clang-11 和 libc++-dev 和 libc++abi-dev),并在其中使用 Clang 11.0.0 和参数进行编译:

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

它给我这个错误:

error: use of undeclared identifier 'socketHandler'
int socket_create(SOCKET &socketHandler)
                          ^

error: expected ';' after top level declarator
int socket_create(SOCKET &socketHandler)
                                        ^

问题:为什么Linux不一样?我在声明中遗漏了什么吗?如果是这样,Windows 中的相同版本的 clang 怎么会编译得很好,而在 Linux 中直接拒绝? TBH,这是我第一次在 Linux 中编译东西,所以我不知道我是否错过了我应该在 Linux 中而不是在 Windows 中为 C++ 做的事情。谢谢。

Linuxreturns中的socket()int,不是socket,也不是SOCKET

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

int hoge(){ return 0; }

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

此错误不会在 Windows 中产生,因为由于 #ifdef 指令,有问题的行 #define SOCKET socket 未在 Windows 中使用。

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