C 定义原型的正确方法

C 定义原型的正确方法,c,prototype,C,Prototype,遇到这样一种情况,我不知道如何以正确的方式定义原型。只看一个简单的例子更容易: A.c.文件: #define foo bar void mon() { foo(); } B.c.文件: void bar() { Do something; } 发出以下警告: 警告:函数没有完整的原型 通常,我会通过以下方式解决: extern void foo(void); 但正如示例所示,函数并不完全存在,而是定义为指向另一个函数。制作原型的正确方法是什么?我认为,会发生以下情况: 编译器将

遇到这样一种情况,我不知道如何以正确的方式定义原型。只看一个简单的例子更容易:

A.c.文件:

#define foo bar

void mon() {
  foo();
}
B.c.文件:

void bar() {
  Do something;
}
发出以下警告:

警告:函数没有完整的原型

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

extern void foo(void);

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

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

编译器将宏
foo
替换为
bar
,但由于在该阶段
bar
没有作为函数声明,编译器会抱怨它找不到它


请参阅更多内容:

我认为,发生的情况如下:

编译器将宏
foo
替换为
bar
,但由于在该阶段
bar
没有作为函数声明,编译器会抱怨它找不到它


请参阅更多信息:

如果编译器遇到声明
extern void foo(void)
#define foo bar
为同一源文件执行
后,它将解析为
外部无效条(void)
和链接器将只解析
符号

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

void bar(void) {
    // Do something;
}

在C中,与C++不同,(无效)的参数列表与空参数列表有细微的区别。

< P>如果编译器遇到声明<代码>外部空FO(无效);
#define foo bar
为同一源文件执行
后,它将解析为
外部无效条(void)
和链接器将只解析
符号

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

void bar(void) {
    // Do something;
}

在C中,与C++不同,(空)的参数列表与空的参数列表有细微的区别。

它没有定义指向另一个函数。它是一个预处理器指令,指定令牌替换。函数根本没有声明。
#define foo bar
你到底想做什么?@Lightness在轨道上比赛,嘿,我什么都不想做。这个警告来自Umon引导加载程序,所以我只是想“纠正”他们的行为方式thinking@StoryTeller,对不起,我这边的词选错了。没有定义指向另一个函数。它是一个预处理器指令,指定令牌替换。函数根本没有声明。
#define foo bar
你到底想做什么?@Lightness在轨道上比赛,嘿,我什么都不想做。这个警告来自Umon引导加载程序,所以我只是想“纠正”他们的行为方式thinking@StoryTeller,对不起,我选错词了嘿,谢谢!这实际上是有道理的。所以正确的方法是像我一直做的那样嘿,谢谢!这实际上是有道理的。所以正确的方法是像我一直做的那样