这是我的程序的一小部分,在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;
}
说明:
答案 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
成员而导致的愚蠢行为。
如果您不以任何方式包含结构定义,您将无法访问其成员,因为它的大小将是未知你将无法声明它的静态实例。