遇到一种情况,我怀疑如何以正确的方式定义原型。看一个简单的例子比较容易:
文件A.c:
#define foo bar
void mon() {
foo();
}
文件B.c:
void bar() {
Do something;
}
发出以下警告:
警告:功能没有完整原型
通常我会通过以下方式解决:
extern void foo(void);
但是如示例所示,该函数并不完全存在,而是被定义为指向另一个函数。制作原型的正确方法是什么?
答案 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;
}
的参数列表与空参数列表略有不同。