我写了这些代码:
#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
它给了我这个错误:
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中应该做的事情,而不是在WindowsforC++中做的事情。谢谢。
发布于 2020-10-22 13:25:52
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;。
https://stackoverflow.com/questions/64483167
复制相似问题