对不起第二篇帖子,我发现线程真的很复杂.. 我试图将结构传递给线程参数,但我收到错误:
error: dereferencing pointer to incomplete type
printf("%d\n", assembly->size);
我不知道如何修复它,这是我的主要代码( test.c )。
#include "test.h"
int main()
{
assembly.size = 10;
pthread_t thread_tid;
pthread_create(&thread_tid, NULL, foo, &assembly);
pthread_join(thread_tid, NULL);
return 0;
}
线程调用的函数( test1.c ):
void * foo(void *param)
{
struct factory *assembly = param;
printf("%d\n", assembly->size);
return NULL;
}
我的头文件包含结构定义( test.h ):
#ifndef TEST1_H
#define TEST1_H
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include "test1.c"
struct factory{
int size;
int products_per_box;
int products_to_assemble;
};
struct factory assembly;
void * foo(void *param);
#endif
答案 0 :(得分:2)
原因是你是 #including
你的另一个.c
文件,使它们成为1个编译单元(这是错误的)。 预处理后,test.c
编译单元中的代码将类似于:
/* contents of <stdio.h> */
/* contents of <stdlib.h> */
/* contents of <pthread.h> */
void * foo(void *param)
{
struct factory *assembly = param;
printf("%d\n", assembly->size); // this line needs knowledge...
return NULL;
}
struct factory{
int size;
int products_per_box;
int products_to_assemble;
}; // ...that is available only after this
// line in this compilation unit
struct factory assembly;
void * foo(void *param);
int main()
{
assembly.size = 10;
pthread_t thread_tid;
pthread_create(&thread_tid, NULL, foo, &assembly);
pthread_join(thread_tid, NULL);
return 0;
}
注意到了吗? C编译器从上到下工作。在printf("%d\n", assembly->size);
行,编译器不知道成员size
的类型,也不知道struct factory
是否有一个成员如此称呼。
您需要做的是test1.c
#include "test.h"
并分别编译test1.c
:
#include "test.h"
void * foo(void *param)
{
struct factory *assembly = param;
printf("%d\n", assembly->size);
return NULL;
}
此外,您希望将struct factory assembly
的声明从头文件中移出main.c
,或者将每个具有该标头的编译单元移出包含的文件将声明该变量。
然后你可以使用一个命令编译和链接它们,例如:
% gcc test.c main.c -o program
或通过单独编译
% gcc -c test.c
% gcc -c main.c
% gcc -o program test.o main.o
答案 1 :(得分:-1)
1)从test.h
删除此行 - 您不需要它
struct factory assembly;
2)在main
中添加assembly.size=10;
struct factory assembly;
3)添加一个角色,即改变
struct factory *assembly = param;
到
struct factory *assembly = (struct factory *)param;
4)正如其他人所指出的那样 - 删除这一行
#include "test1.c"
通常,您只包含标题文件