C 错误:返回类型是不完整的类型

C 错误:返回类型是不完整的类型,c,struct,return-type,C,Struct,Return Type,我不明白这是什么意思: error: return type is an incomplete type" 我只想返回结构。我已经分离了两个音频通道,我想使用一个struct返回它们,并使用惟一的函数 main.c: #include "functions.h" ... struct LandR sepChannels_8( unsigned char *, unsigned long, unsigned char *, unsigned char *); ... int main() {

我不明白这是什么意思:

error: return type is an incomplete type"
我只想返回结构。我已经分离了两个音频通道,我想使用一个struct返回它们,并使用惟一的函数

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 );

    ...
}
...
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;
}
...
函数.h

#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 );

    ...
}
...
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;
}
...
。。。
结构LandR sepChannels_8(无符号字符*smp,无符号长N,无符号字符*L,无符号字符*R)
{
结构着陆器
{
无符号字符*L;
无符号字符*R;
};
结构-陆地-航道;
int i;
如果(N%2==0)
{
L=malloc(N/2);
R=malloc(N/2);
}
其他的
如果(N%2==1)
{
L=malloc(N/2);
R=malloc(N/2);
}
对于(i=0;i
结构的完整声明似乎不存在,只有一个转发声明(如
struct foo;
),因此返回类型不完整-您不能这样做。

如果您想使用类型,您需要在之前声明它

struct LandR
在本地声明为
sep8

如果要将声明作为函数的返回类型公开,请将其移动到全局范围


另外:按照约定,原型、常量和类型定义将进入
.h
文件。实现进入
.c
文件。

更多的解释(应该在每个好的c教程中都有):

将必须出现在多个位置的所有内容放入
.h
文件中。也就是说,主要是变量、函数原型、typedef、结构、枚举等的
extern
声明

将每个函数的实际代码放入
.c
文件中。让它们包含所需的
.h
文件,并且只包含所需的文件


防止多个包含头文件,并使用。

是否在尝试使用该结构时定义了该结构?这是示例代码中的一个输入错误,还是您真的试图在函数本身中定义函数的返回类型?您对
.c
.h
文件的使用非常落后-您在
main.c
中有原型,在
function.h
中有函数体。但是您确实成功地将
main
放在
main.c
中。在我的例子中,我包含了部分打包文件,但没有包含完整的打包文件,在更正了包含文件之后,这个错误已经解决了。如果我在
main.c
的开头创建
struct LandR LRChannels
,然后将LRChannels作为参数传递给函数,然后返回这个包含2个数组(通道)的结构会好吗?@Julian在头中定义结构。在需要的时候/地方包括标题。你想说我必须:在
.h
中声明变量、函数的原型,并在
.c
中实现这些函数?@yullian:“你想说我必须”否。