2013-05-21 104 views
3

我不明白这是什么意思:错误:返回类型是一个不完全类型

error: return type is an incomplete type" 

我只是想返回结构。我分开了两个音频通道,我想使用唯一的函数使用结构返回它们。

的main.c

#include "functions.h" 
... 
struct LandR sepChannels_8(unsigned char *, unsigned long, unsigned char *, unsigned char *); 
... 
int main() 
{ 
    ... 

    sepChannels_8(ptrSamples_8, n, ptrSamples_8_L, ptrSamples_8_R); 

    ... 
} 

function.h

... 
struct LandR sepChannels_8(unsigned char *smp, unsigned long N, unsigned char *L, unsigned char *R) 
{ 
    struct LandR 
{ 
    unsigned char *L; 
    unsigned char *R; 
}; 
struct LandR LRChannels; 

int i; 

if (N % 2 == 0) 
{ 
    L = malloc(N/2); 
    R = malloc(N/2); 
} 
else 
    if (N % 2 == 1) 
    { 
     L = malloc(N/2); 
     R = malloc(N/2); 
    } 

for (i = 0; i < N; i++) // separating 
{ 
    L[2 * i + 0] = smp[2 * i + 0]; 
    R[2 * i + 0] = smp[2 * i + 1]; 
} 
return LRChannels; 
} 
... 
+3

结构_defined_在你尝试使用它的地步吗?这是你的示例代码中的拼写错误,还是你真的想在函数本身中定义函数的返回类型? –

+4

您对'.c'和'.h'文件的使用非常倒退 - 您在'main.c'中创建了原型,在'function.h'中创建了函数体。但是你确实设法把'main'放在'main.c'中。 –

回答

4

如果你想使用一个类型,你需要先声明它。

struct LandR在本地声明为sepChannels_8

将声明移入全局范围,如果您想将其作为函数的返回类型公开。


另外:按照惯例原型,常数和类型定义进入.h文件。实现进入.c文件。

+1

你想说我必须:在'.h'中声明变量,函数的原型并在'.c'中实现这些函数? – yulian

+0

是的,这是有效的。 – alk

1

看来,该结构的完整声明是不存在的,只有一个向前声明(如struct foo; ),所以返回类型是不完整的 - 你不能这样做。

+0

如果我在'main.c'的开头创建'struct LandR LRChannels',然后将LRChannels传递给一个函数作为参数,并且在返回包含2个数组(通道)的结构之后会好吗? – yulian

+1

@Julian改为在头部定义结构。在需要/需要时包含标题。 – 2013-05-21 17:52:14

1

多一点解释(这应该在每一个优秀的C教程也是可用的):

把一切都必须出现在几个地方为.h文件的内容。也就是说,主要是extern变量的声明,函数原型,typedef,结构体,枚举等。

把每个函数的实际代码放到一个.c文件中。让他们包含所需的.h文件并仅包含所需的文件。

防止将头文件与include guard多个包含在一起。