遇到的错误以及一些配置、做个记录
程序员文章站
2022-05-30 15:12:44
...
Vs2012 重定义的错误
2018-12-5
今天我遇到了一个链接期错误“重定义”、以前也遇到过、但是以前是“真的重定义”、有重复的变量或者是重定义的函数、但是这次不一样、听我讲清整个事件的全过程:
地点:一个头文件中、暂时命名为“app.h”,更细致一些是在一个命名空间中如下:
namespace test
{
namespace APP
{
boost::shared_ptr<Test> test;
}
}
事件:发生了重定义错误、
这个错误我找了好久、就是不知道错误到底出在哪里。于是开始上网搜索解决办法、在一个角落我看到了类似答案的回答:
“首先源码组织的就不符合规范,C++程序语言设计(C++之父写的那本)专门有一章讲如何组织源码(包括物理上的文件,和逻辑上的名字空间/类声明定义)。比如:类声明是放在.h中的,如果分离类定义则是在.cpp,如果不分离而用inline定义则也是在.h中,函数与类类似,模版都放在.h中,全局变量放在.cpp中,在.h中只放extern变量声明,#pragma once是include保护,它应该内置保护(就是放到.h文件的头部)等等。而现在你的程序出现了连接错误,一般就是因为有一个符号没有定义而你使用了,或者一个符号你定义了几次(符号是编译原理术语,类名、函数名、变量名等都是符号)”
我才意识到我以前确实没有在头文件中定义过变量;现在才知道
#ifndef APP_H
#define APP_H
int ppp = 0; //这样都是不可以的、都会导致链接期的重定义错误
namespace test
{
int qqq = 0; //这个也是
}
#endif
正确的如下:
//app.h
#ifndef APP_H
#define APP_H
extern int ppp; //对变量声明、不能再头文件中定义
#endif
//app.cpp
#include "app.h"
int ppp = 0; //对变量定义
上一篇: excel-export,关于node生成文件流导出excel
下一篇: 分享实用小案例:关闭二维码