g ++ 5.3在<function>之前预期的初始化程序

时间:2016-02-03 18:14:02

标签: c++ gcc

据我所知,此错误通常是语法问题。我已经用精细的牙齿梳理了它并且无法发现它。下面的示例被削减为几个显示问题的文件。头文件描述了一个API,它作为我在Eclipse项目中引用的一些lib文件提供,但只是尝试从命令行编译以下内容会产生同样的错误。

在获得第一个函数声明之前,我有几个链式包含,它会抛出一个&#34;期望的初始化器&#34;错误,以及随后的所有其他声明。

的main.cpp

#include <iostream>
#include <string>
#include <windows.h>
#include "defn.h"

using namespace std;

int main()
{
    cout << "hello world" << endl;
    return 0;
}

defn.h

#ifndef GEO_DEFINITIONS_H_INCLUDED
#define GEO_DEFINITIONS_H_INCLUDED

#include <iostream>
#include <string>

#define C_MICROSOFT
#define _UNICODE
#include "gxlib.h"

#endif // GEO_DEFINITIONS_H_INCLUDED

gxlib.h

#pragma once

#include <windows.h>

#ifdef C_MICROSOFT

#define GX_WRAPPER_FUNC  __declspec(dllexport)
#define GX_STANDARD_FUNC
#define GX_WRAPPER_CALL  _cdecl
#define GX_STANDARD_CALL _stdcall

#define GX_OBJECT_PTR    void*

#define GX_VAR
#define GX_CONST         const

#define GX_VOID          void
#define GX_LONG          long
#define GX_DOUBLE        double
#define GX_HANDLE        long

#define GX_LONG_PTR      long*
#define GX_DOUBLE_PTR    double*
#define GX_HANDLE_PTR    long*
#define GX_ASTR_PTR      char*
#define GX_WSTR_PTR      wchar_t*
#if defined(GEO_UTF8)
   #define GX_STR_PTR       GX_ASTR_PTR
#elif defined( _UNICODE)
   #define GX_STR_PTR       GX_WSTR_PTR
#else
   #define GX_STR_PTR       GX_ASTR_PTR
#endif

#endif


#ifdef __cplusplus
   extern "C" {
#endif



/*---------------- Copy_3DN[_public] ----------------*/

GX_WRAPPER_FUNC GX_LONG GX_WRAPPER_CALL
Copy_3DN(GX_VAR   GX_OBJECT_PTR,
         GX_CONST GX_HANDLE_PTR,
         GX_CONST GX_HANDLE_PTR);


#ifdef __cplusplus
   }
#endif

命令行和确切错误是

c:\Code\CPP>g++ -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -o main.o main.cpp
In file included from defn.h:11:0,
                 from main.cpp:4:
gxlib.h:55:1: error: expected initializer before 'Copy_3DN'
 Copy_3DN(GX_VAR   GX_OBJECT_PTR,

正如我上面提到的,这只是我使用MinGW-64 5.3工具链在Eclipse Mars中构建的大型项目的摘录。在Eclipse中,我已经定义了所有包含文件并链接到库,但是这个简单的命令行示例包含了同一目录中的所有内容,这表明了错误。

1 个答案:

答案 0 :(得分:0)

@ SamVarshavchik的评论和this帖子引起了我的回答。问题是MSVC特定语法

#define GX_WRAPPER_FUNC  __declspec(dllexport)
#define GX_STANDARD_FUNC
#define GX_WRAPPER_CALL  _cdecl
#define GX_STANDARD_CALL _stdcall

在我的情况下,MSVC定义包含在C_MICROSOFT #ifdef块中,这是该定义的唯一出现,因此最简单的解决方案是删除defn.h中的C_MICROSOFT定义并将其替换为:

#ifdef __GNUC__
    #define GX_WRAPPER_FUNC  __attribute__ ((dllexport))
    #define GX_STANDARD_FUNC
    #define GX_WRAPPER_CALL __attribute__((cdecl))
    #define GX_STANDARD_CALL __attribute__((stdcall))
    #define _stdcall __attribute__((stdcall))
    #define _cdecl __attribute__((cdecl))

    #define GX_OBJECT_PTR    void*

    #define GX_VAR
    #define GX_CONST         const

    #define GX_VOID          void
    #define GX_LONG          long
    #define GX_DOUBLE        double
    #define GX_HANDLE        long

    #define GX_LONG_PTR      long*
    #define GX_DOUBLE_PTR    double*
    #define GX_HANDLE_PTR    long*
    #define GX_ASTR_PTR      char*
    #define GX_WSTR_PTR      wchar_t*
    #define GX_STR_PTR       GX_WSTR_PTR
#else
    #define C_MICROSOFT
#endif