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、不明白重复定义的标准
头文件还好处理,你可以用宏来防止重复编译
#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 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语言时出错,连简单的Hello World都报错,调试时显示无法启动程序,无法访问
请问vs2013编写C语言 如何添加注释块, 像这样, 就是自动生成注释块?