簡體   English   中英

在 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++ 做的事情。 謝謝你。

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

您在 Linux 模式下使用#define SOCKET socket ,它會將函數名稱放在需要類型名稱的位置,如下所示:

int hoge(){ return 0; }

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

這個錯誤不會在 Windows 中產生,因為有問題的行#define SOCKET socket沒有在 Windows 中使用,這要歸功於#ifdef指令。

總之,# #define SOCKET socket應該是typedef int SOCKET; .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM