C语言问题,vs2013“已经在xxx。obj中定义”怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言问题,vs2013“已经在xxx。obj中定义”怎么解决相关的知识,希望对你有一定的参考价值。

我想要在include.cpp源文件中调用自己定义的函数,但是在包含头文件的时候遇到了错误,为什么会这样?它提示我已经在data.obj中定义,本人愚钝,怎么找也没有找到问题所在!而且我试过,只要把data.cpp或者include.cpp中的任何一个后缀改成.c就没有这个问题,这是怎么回事?望各位大神帮帮忙说明:data.h中定义了a,b,cdata.cpp中定义了add函数,并且引用了data头文件下面放出详细图片:
不懂的问题有以下几点:
1、我想要在include.cpp源文件中调用自己定义的函数,但是在包含头文件的时候遇到了错误,它提示我已经在data.obj中定义
2、我试过只要把data.cpp或者include.cpp中的任何一个后缀改成.c就没有这个问题,既然C++兼容C,那么以.cpp运行应该也没有问题啊
3、不明白重复定义的标准

你的include和工程有矛盾, include.cpp 其实是包含了三个文件内容的一个文件,你不能把include.cpp看成三个有着包含关系的独立文件,而是三个文件拼成了的一个文件,所以就具有其它两个文件中的所有内容,然而你工程里面又加了data.cpp和data.h, 那么实际上data.cpp和data.h里的东西就相当于有了2遍,自然就重复定义了。
头文件还好处理,你可以用宏来防止重复编译
#ifndef _DATA_H_
#define _DATA_H_
........ // 头文件里的内容
#endif
但C文件不好这么弄,因为C文件里的定义只在定义的那个C文件里起作用,如果你inlcude了一个C文件,就可以把这个文件从工程里面去掉就行追问

你的意思是我添加了data.cpp和data.h文件之后,include.cpp里就拥有了这两个文件的内容?而我再次引用它,就是重复定义了吗?
刚开始自学不懂什么叫做宏。。。
把include.cpp改成.c能够成功运行,是因为你说的“C文件里的定义只在定义的那个C文件里起作用”吗?
include了c文件之后把它去掉还能运行的吗?没有这个文件不是应该不能运行吗?

追答

可能你还是不明白,这样来看吧,工程里面有三个文件,分别是data.cpp, data.h, include.cpp. 

include.cpp里面包含了data.cpp, data.cpp里面包含了data.h, 这样其实三个文件的内容就分别如下:

include.cpp:

#include <strio.h>
int a = 10;
int b = 20;
inc c;
#include <strio.h>

void add()

    c=a+b;
    printf( "%d", c ) ;


void main()

   add();
   getchar();

data.cpp:

int a = 10;
int b = 20;
inc c;
#include <strio.h>

void add()

    c=a+b;
    printf( "%d", c ) ;

data.h:

int a = 10;
int b = 20;
inc c;

当你把这三个文件都加入工程,不难看出来重复定义了吧。 

h文件中的定义因为是全局的,所以用我说的宏的方式可以避免重复编译,只会编译一次

c文件的定义因为是局部的,只在本文件中生效,所以整个工程编译的时候,用宏的方法就不能做到只编译一次。

你说的改成cpp就好了,这是有可能的,因为C和C++的编译规则是不同的,所以即使同名,C和C++编译之后的符合可能是不同的,这样就能通过了

追问

不是改成.cpp文件,是改成.c文件就能运行。我有点懂了,也就是说这种情况下,如果不把data.h的内容放入data.cpp中,就只能使用宏的方法来避免重复定义?

参考技术A

用法的问题.

    开发环境的项目规则, 所有的.C都会进行编译.

    你在include.cpp中, 重复引入data.cpp, 导致重复产生了两个add function.

    .h在使用方法上, 适用於宣告, 应避免置放实作 (int a = 10;)

    include.cpp 应该 #include "data.h"

    data.h应该只放置add()的宣告, ex:
    extern void add();

    变量不放在.h是为了避免重复定义, 也避免不同.c各自使用了同名的不同变量.
    所以, a,b,c 应该放在data.cpp

    文件命名问题, C++使用 .cpp/.hpp, C使用.c/.h, 应确认你对每个档案的使用环境, 使用配对的文件名称.

Vs2012编写C语言

  本来我也是用VC++6.0编写C语言的,但是由于这个版本过老并且和win7,win8,win10的不兼容所以去下载了vs2012,一开始的时候不知道怎么用,现在学会了就写一个教程分享一下。

  

  

  

  

   

  

  

  

  

  

  

  

  

  这时就遇到一个问题,VS2012一运行控制台程序,控制台就闪退,这种情况在VS2008和VS2010这两版本不存在,VS2012这个版本需要通过语句或者断点加以中断,语句可用getchar()或者

system("PAUSE")或者随便一句输入语句或者增加断点。system("PAUSE")在stdlib.h中。  

1 #include<stdio.h>
2 #include<stdlib.h>
3 
4 int main()
5 {
6     printf("Hello World!\\n");
7     system("PAUSE");
8     //getchar();
9 }

 

以上是关于C语言问题,vs2013“已经在xxx。obj中定义”怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

如何使用VS2013编写C语言? 包括编译连接和运行测试.

使用VS2013调试C语言时出错,连简单的Hello World都报错,调试时显示无法启动程序,无法访问

请问vs2013编写C语言 如何添加注释块, 像这样, 就是自动生成注释块?

C语言问题,vs2013“已经在xxx。obj中定义”怎么解决

C语言编译器VS2012问题

C语言 显示strcpy出错 求大神解释 编译器是vs2013