欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

遇到的错误以及一些配置、做个记录

程序员文章站 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;        //对变量定义

 

相关标签: 错误总结