错误:预期为'='''''';asm&x27;或'__属性';在'之前*';C中的标记

错误:预期为'='''''';asm&x27;或'__属性';在'之前*';C中的标记,c,file-io,header-files,C,File Io,Header Files,我有以下声明 文件*fptr; 文件*optr; 用algo.h 我在main.c中有main,它可以打开这些文件。 如果将声明放在头文件中,则会出现上述错误。如果我把它放在main.c中,那么我会得到多个定义错误,比如 src\main.o:main.c:(.bss+0xc88)rcount的多个定义 src\new_algo.o:new_algo.c:(.bss+0xc88):首先在这里定义 src\main.o:main.c:(.bss+0xc8c):条件的多个定义 src\new_a

我有以下声明

文件*fptr;
文件*optr;

用algo.h 我在main.c中有main,它可以打开这些文件。 如果将声明放在头文件中,则会出现上述错误。如果我把它放在main.c中,那么我会得到多个定义错误,比如


src\main.o:main.c:(.bss+0xc88)
rcount的多个定义
src\new_algo.o:new_algo.c:(.bss+0xc88):首先在这里定义
src\main.o:main.c:(.bss+0xc8c):条件的多个定义
src\new_algo.o:new_algo.c:(.bss+0xc8c):首先在这里定义

听起来有点像您(1)在使用
文件的地方没有包含
,和/或(2)在头中有一些非
静态的
可执行代码或非
外部的
变量定义(和/或是
包含
c文件)

第一种情况通常会导致未定义
文件
(或者在某些情况下将
类型定义为不存在的类型)。第二种方法会导致在包含文件的每个翻译单元中定义内容,这会混淆链接器


修复:(1)在使用
文件
的文件中包含
,以及(2)将共享定义从标题移动到.c文件中(和/或根据需要将其声明为
静态
外部
),并且只包含
\include
.h文件。

听起来好像没有包含stdio。加

#include <stdio.h>
#包括

在这些声明上面的头文件中。

您在algo.h中拥有的是定义,而不是声明。如果您有文件*fptr;文件*optr在源文件和头文件中声明变量两次

你需要:

算法h

extern FILE *fptr; 
extern FILE *optr;
算法c

FILE *fptr; 
FILE *optr;

链接器错误与您发布的
文件
变量无关


源代码中有两个变量,分别名为
rcount
condi
,根据链接器,这两个变量都在两个源文件中定义。原因是,我猜,您在包含在两个源文件中的头文件中定义了这些变量。一些旧的编译器仍然不能处理这个问题。

是的,在main.c和新的算法中。c@Namratha你有没有把stdio.h放在algo.h之前,或者放在algo.h之后?上面提到过,我有。如果头文件包含new_algo.h,我会得到新的多个defn错误如果包含的文件中有
void example(){}
,则包含它的每个.c文件都会看到(并编译)自己的
example
副本。(它可能在这里内联,但为了论证起见,假设它不会。)在链接时间到来时,链接器需要查看一个
示例,或者它不知道使用哪一个
static
使定义基本上对翻译单元私有,因此每个定义都可以有自己的副本,而不会引起链接器的抱怨。至于全局变量,每个变量也必须定义在一个翻译单元中——其他翻译单元应该将其声明为
extern
。翻译单元是源文件,加上沿途得到的
#include
d,减去得到的
#ifdef
'd。可以将其视为预处理器完成工作后该文件的代码。只有主函数使用文件指针。所以我不需要新的算法c就能看到这些。我试着在头文件中将它声明为extern,并使用文件*fptr;文件*optr;在main.c中,但我仍然得到多定义错误。为什么不允许在头文件中简单地声明这些文件,以便包含头文件的任何.c文件都可以看到这一点?如果只有主函数使用文件指针,那么为什么它们是全局的?只需将它们粘贴到函数本身中并使用它即可。至于问题,每个翻译单元将独立地转换为一个目标文件。链接器故意简单,有点懒惰。它基本上只看到名称、大小和内容。如果它看到定义了多个
foo
,它只看到一堆标记为
foo
——它不知道它们是对同一事物的引用,或者(在C的情况下)甚至不知道它们是什么类型的。它不会去检查字节,看它们是否是“相同的东西”,因为它不能可靠地做到这一点。因此,它依赖于程序员和编译器来说“这是我的foo,其他东西也引用了它”。只有主函数使用文件指针。所以我不需要新的算法c就能看到这些。我试着做了上面的工作,但是文件*fptr;文件*optr;在main.c中,但我仍然得到多定义错误。为什么不允许在头文件中简单地声明这些符号,以便包含头文件的任何.c文件都可以看到这些符号?您的定义放在源文件(例如file*fp;)中,这会告诉编译器为该符号分配空间。您的声明(例如外部文件**fp;)告诉编译器符号的空间已经分配,链接器需要解析符号。错误日志表明rcount和condi定义了不止一次。在任何情况下,都不要在头文件中声明变量(即始终使用extern)。