2017-09-23 208 views
-1

我正在使用C生成文件,当它只有main.c和data.h,但只要我添加了一个函数头到data.h和并为该函数提供文件,该函数实际上定义了它在编译时开始出错的函数。使用头文件和生成文件在C中函数的冲突的类型

我:

/* main.c */ 
#include "data.h" 
int main() { /* this is empty */ } 

/* data.h */ 
char foo(char); 

/* foo.c */ 
#include "data.h" 
char foo(char){ 
    ... 
} 

我得到的错误是conflicting types for 'foo'note: previous declaration of 'foo'

有人问过这个问题的其他人试图使用一个函数之前,它被宣布或沿着这些行的东西,但我似乎无法找到在这个例子中出现。

+3

什么是实际的完整错误信息? – melpomene

+2

Makefile在哪里? –

+0

makefile与其他文件位于同一目录中。完整的错误是''foo'data.h'的冲突类型。1:注意:'foo'的前面声明在这里' –

回答

1

foodata.h签名错误消息听起来是不一样的在foo.c

例如

char foo(char); 

char foo(char*); 

// missing return type may produce a different/additional warning/error, depending on the compiler 
foo(char); 

检查冲突的声明的具体位置和比较。

+0

我没有data.c –

-1

您在头文件中忘记了包含警卫。它被包含在两个C文件中,所以你可以得到相同的两个函数声明。像这样改变你的头文件。

#ifndef DATA_H 
#define DATA_H 

char foo(char); 

#endif 
+1

虽然通常是一个好主意,但这并不能解释为什么编译器认为它们是*不同*。 –

+1

它甚至不相关。即使没有包括OP在内的守卫,OP所发布的代码也可以工作。 – WhozCraig