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