为什么MSVC工作和GNU出错:数组类型使用struct的元素类型不完整

时间:2015-01-09 22:47:08

标签: c

这是我的程序的一小部分,在visual studio,gcc和另一个编译器上运行。尝试编译下面的代码我从我的gcc编译器得到以下错误:

In file included from myData.h:5:0,
                 from main.c:2:
def.h:14:39: error: array type has incomplete element type
   extern CONST_MACRO_DEF( struct foo, myData[] );
                                   ^
def.h:10:63: note: in definition of macro 'CONST_MACRO_DEF'
   #define CONST_MACRO_DEF( arg_type, arg_name) const arg_type arg_name __attribute__((section(".INFO")))

文件macro.h

#ifndef MACRO_H_
#define MACRO_H_

#include <stdio.h>


#if defined (_MSC_VER)
   #pragma section(".INFO")
   #define CONST_MACRO_DEF( arg_type, arg_name) const arg_type __declspec(allocate(".INFO")) arg_name
#elif defined( __GNUC__ )    
   #define CONST_MACRO_DEF( arg_type, arg_name) const arg_type arg_name __attribute__((section(".INFO")))
#else
   #define CONST_MACRO_DEF( arg_type, arg_name) const arg_type arg_name 
#endif

struct foo;

extern CONST_MACRO_DEF( struct foo, myData[] );

#endif /* MACRO_H_ */

文件myData.h

#ifndef MY_DATA_H_
#define MY_DATA_H_

#include "def.h"

struct foo
{
   int    nummer;
   double myHight;
};


CONST_MACRO_DEF( struct foo, myData[] ) = 
{
   { 1 , 5.5 },
   { 2 , 6.0 },
   { 3 , 7.9 }
};

#endif

文件main.c

#include <stdio.h>
#include "myData.h"

int main(void)
{

    return 0;
}

说明:

  • 使用visual studio成功编译了真实代码,但没有使用GCC编译器。
  • 如果我将macro.h中的struct foo从不完整类型更改为完整类型,通过从myData.h移动它的定义并将其放在def.h中,可以用gcc编译代码。 (我更喜欢在macro.h中保持struct foo的解决方案,这是一种不完整的类型)

2 个答案:

答案 0 :(得分:1)

差异可能在于处理 declspec(allocate(&#34; .INFO&#34;))和__attribute ((section(&#34; .INFO&#34;)) )。

现在这些事情明显是非标准的。您应该检查MSVC和GCC文档。

关于gcc section属性应该用于变量,而不是extern声明因此错误与不完整类型有关。

答案 1 :(得分:0)

如果你使用指针,你可以使用这样的前向声明

struct foo;

然后你可以有这种声明

struct foo *somefoo;

但如果您不包含struct定义,则不允许您访问struct的成员。

这实际上是一种不会隐藏用户的成员的技术,它被称为opaque struct并且它非常有用,因为c中没有private个关键字,它可以帮助隐藏定义以避免因直接更改struct成员而导致的愚蠢行为。

如果您不以任何方式包含结构定义,您将无法访问其成员,因为它的大小将是未知你将无法声明它的静态实例。