const char的多重定义*

时间:2014-07-03 15:58:01

标签: c++ linker-errors multiple-definition-error

我得到了全局

的上述消息链接器错误
const char* HOST_NAME = "127.0.0.1";

我不认为我已经编译了两次文件但是这里是我对文件的定义。

的main.cpp

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include "connection.hpp"

connection.cpp

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <arpa/inet.h>
#include "connection.hpp"

connection.hpp

#ifndef __connection__
#define __connection__
#include <unistd.h>
#include <netinet/in.h>

const int BUFFSIZE = sysconf(_SC_PAGESIZE);             //Define page size
const char* HOST_NAME = "127.0.0.1";                    //Local host
//Definition of a class
#endif

任何帮助?

3 个答案:

答案 0 :(得分:20)

您对字符串常量使用了错误的声明。您需要使字符串成为常量,因为常量可以在多个编译单元中定义。这就是编译器不为BUFFISZE报告相同错误的原因:BUFFSIZE是const,因此可以在不同的编译单元中多次定义它。但是HOST_NAME不是常量,所以据报道。如果您将其声明更改为

,则HOST_NAME将为const
const char* const HOST_NAME = "127.0.0.1"; 

然后错误就会消失。


  

[C++11: 3.5/3]: 具有命名空间范围的名称(3.3.6)如果名称为,则具有内部链接

     
      
  • 显式声明为static的变量,函数或函数模板;或者,
  •   
  • 明确声明为const constexpr的变量,既未明确声明extern也未声明具有外部链接;或
  •   
  • 匿名工会的数据成员。
  •   

这有效地使定义它的每个翻译单元保持“本地”,从而消除冲突的机会。

答案 1 :(得分:3)

您已将“connection.hpp”包含在connection.cpp和main.cpp中。因此,它(const char* HOST_NAME = "127.0.0.1";)在2个cpp文件中定义。

答案 2 :(得分:2)

  不要以为我已经编译了两次文件

尽管如此,究竟发生了什么。您已经多次编译connection.hpp,每次# include进入某个翻译单元。

static添加到声明中,或向其添加extern,删除= somestring部分,并在一个源文件中提供定义。