2011-04-07 77 views
1

'*' 标记 'ASM' 或 '__attribute__' 我有以下声明错误:预期 '=', '', ';',之前用C

FILE *fptr; FILE *optr;

在algo.h 我有main.c打开这些文件的主。 如果我将声明放在头文件中,我会得到上述错误。如果我把它放在main.c中,然后我得到这样

src\main.o:main.c:(.bss+0xc88): multiple definition of rcount' src\new_algo.o:new_algo.c:(.bss+0xc88): first defined here src\main.o:main.c:(.bss+0xc8c): multiple definition of康迪” 的src \ new_algo.o多发性定义错误:new_algo.c :(BSS + 0xc8c):这里首先定义

+0

您是否包含stdio.h? – 2011-04-07 03:57:45

+0

是的,在main.c和new_algo.c中 – Namratha 2011-04-07 03:59:48

+0

@Namratha和包括algo.h之前是否包含stdio.h之前? – nos 2011-11-22 10:14:01

回答

1

有点听起来像你(1)没有包括<stdio.h>你正在使用FILE,和/或(2)有一些非static可执行代码或非extern您的标题中的变量定义(和/或是一个C的#include文件)。

第一个通常会导致FILE未被定义(或者在某些情况下将typedef'd转换为不存在的类型)。第二个会导致在包含该文件的每个翻译单元中定义填充,这会混淆链接器。

要解决:(1)#include <stdio.h>其中使用FILE在文件中,以及(2)从报头插入.c文件移动共享定义(和/或它们声明为staticextern适当时),和只有#include .h文件。

+0

你能解释一下你的第二点吗? – Namratha 2011-04-07 04:00:40

+1

如果你在包含文件中有void void(){}',每个都是。包含它的c文件将会看到(并编译)它自己的'example'副本。 (它可能在这里内联,但为了参数的缘故,假设它不会)。当链接时间到了,链接器需要看到一个'example',或者它不知道要使用哪一个。 'static'使得定义对于翻译单元来说基本上是私有的,所以每一个都可以拥有自己的副本,而不需要连接器抱怨。至于全局变量,每个变量都必须在一个翻译单元中定义 - 其他翻译单元应该将其声明为'extern'。 – cHao 2011-04-07 04:07:51

+0

我明白了。你翻译单元的意思是什么? – Namratha 2011-04-07 04:13:13

0

听起来像你不包括stdio。添加

#include <stdio.h> 

在你的头文件上面那些声明。

+0

上面提到,我有。如果包含头文件 new_algo.h,我得到新的多重定义错误 – Namratha 2011-04-07 04:04:16

1

你在algo.h中有一个定义不是一个声明。如果你有FILE * fptr;文件* optr;在源文件和头文件中,然后你声明变量两次。

您需要:

algo.h

extern FILE *fptr; 
extern FILE *optr; 

algo.c

FILE *fptr; 
FILE *optr; 
+0

只有主函数使用文件指针。所以我不需要new_algo.c来查看这些。我试着做上面的,但有FILE * fptr;文件* optr;在main.c中,但我仍然遇到多重定义错误。为什么不允许在头文件中简单地声明它们,这样任何包含头文件的.c文件都可以看到这一点? – Namratha 2011-04-07 04:30:50

+0

你的定义放在一个源文件中(例如** FILE * fp; **),这告诉编译器为该符号分配空间。你的声明(例如** extern FILE ** fp; **)告诉编译器该符号的空间已经被分配,链接器需要解析这个符号。您的错误日志表明** rcount **和** condi **定义了多次。无论如何,不​​要在头文件中声明变量(即总是使用extern)。 – Ben 2011-04-07 04:54:45

0

的链接错误,什么都没有做与您发布的FILE变量。

您的源代码有两个变量,分别命名为rcountcondi,即根据链接器定义的源文件。我想,原因是你在包含在两个源文件中的头文件中定义了这些变量。一些旧的编译器仍然无法处理。

相关问题