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;
。
我写了这些代码:
#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;
。