浏览MSDN处的RPC教程,
我刚刚创建了一个包含两个.c
文件的项目,如下所示::
/* file hellop.c */
#include <stdio.h>
#include <windows.h>
void HelloProc(char * pszString)
{
printf("%s\n", pszString);
return ;
}
和
/* file: hello.c */
#include "hellop.c"
void main(void)
{
char * pszString = "Hello, World";
HelloProc(pszString);
return ;
}
编译器为什么以及在哪里看到HelloProc(char*)
的多符号定义或声明?
编辑:: 正如本SO_Question中所述,包含.h
文件显然是最佳解决方案。但这是否会让我们没有实现设计,我们可以将.c
文件包含到另一个.c
文件中?
奇怪的行为:: 第一次编译运行正常,但重建解决方案会出现上述错误。您可以通过将文件名从.c
更改为.cpp
来检查多次首次编译,反之亦然。为什么会出现这种行为? (我不确定是否还有其他人在给定的例子中也遇到过这种情况)
答案 0 :(得分:2)
您编译HelloProc
两次,因为hello.c
文件中包含#include "hellop.c"
文件中此函数的完整定义,而您只需要声明它。你应该把函数原型放在头文件中。
#ifndef HELLOP_H
#define HELLOP_H
#include <stdio.h>
#include <windows.h>
void HelloProc(char * pszString);
#endif
并在hellop.c
和hello.c
编辑:#include
不是像你说的那样剪切粘贴,而是更多的复制粘贴
#include&#34; q-char-sequence&#34;新行
导致该指令的全部内容被替换 源文件由&#34;之间的指定序列标识。 分隔符
因此,您可以与HelloProc
中hellop.c
的两个定义以及hello.c
中的另一个定义建立联系。另一种解决方法是仅编译hello.c
文件,这样就没有HelloProc
的重复。了解如何在VisualStudio here