0

通过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 ;
}

问题::错误LNK2005和致命错误LNK1169

编译器为什么以及在哪里看到多个符号定义或声明HelloProc(char*)

编辑::正如在这个SO_Question中得出的结论,包括.h文件显然是最好的解决方案。但这是否让我们无法实现可以将一个.c文件包含到另一个.c文件中的设计?

奇怪的行为::第一次编译运行良好,但解决方案的重建因上述错误而中断。.c您可以通过将文件名更改为to来检查多次首次编译,.cpp反之亦然。为什么它会表现出这种行为?(我不确定其他人是否也通过给定的示例经历过这种情况)

4

1 回答 1

2

你编译了两次,因为你在文件 byHelloProc中包含了这个函数的整个定义,而你只需要声明它。您应该将函数原型放在头文件中。hello.c#include "hellop.c"

     #ifndef HELLOP_H
     #define HELLOP_H

     #include <stdio.h>
     #include <windows.h>

     void HelloProc(char * pszString);

     #endif

hellop.c并在 in和 in 中包含头文件hello.c

编辑:#include不是你说的剪切粘贴,它更像是复制粘贴

# 包含“q-char-sequence”换行符

导致用 " 分隔符之间的指定序列标识的源文件的全部内容替换该指令

HelloProc因此,您可以将一个 inhellop.c和另一个 in的两个定义联系起来hello.c。另一种解决方法是只编译hello.c文件,这样就没有HelloProc. 在此处查看如何在 VisualStudio 中执行此操作

于 2014-04-02T06:21:37.083 回答