[英]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
,而不是socket
或SOCKET
。
您在 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.