正确定义原型的方法

时间:2016-08-03 10:43:35

标签: c prototype

遇到一种情况,我怀疑如何以正确的方式定义原型。看一个简单的例子比较容易:

文件A.c:

#define foo bar

void mon() {
  foo();
}

文件B.c:

void bar() {
  Do something;
}

发出以下警告:

警告:功能没有完整原型

通常我会通过以下方式解决:

extern void foo(void);

但是如示例所示,该函数并不完全存在,而是被定义为指向另一个函数。制作原型的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

我认为,会发生以下情况:

编译器用name = 'Jo%' 替换宏foo但是因为在那个阶段bar没有被声明为编译器会抱怨的任何地方,它无法找到它。

请参阅更多内容:Are prototypes required for all functions in C89, C90 or C99?

答案 1 :(得分:0)

如果编译器在{/ 1}}之后遇到相同源文件的声明extern void foo(void); ,它会将其解析为#define foo bar并且链接器将只解决extern void bar(void);符号。

请注意,您bar的定义与上述声明不一致。 bar的定义应为:

bar
在C语言中,与C ++不同,void bar(void) { // Do something; } 的参数列表与空参数列表略有不同。