const char的多重定义*

Bil*_*nde 4 c++ linker-errors multiple-definition-error

我得到了全局的上述消息链接器错误

const char* HOST_NAME = "127.0.0.1";
Run Code Online (Sandbox Code Playgroud)

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

main.cpp中

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include "connection.hpp"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

Woj*_*wka 24

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

const char* const HOST_NAME = "127.0.0.1"; 
Run Code Online (Sandbox Code Playgroud)

然后错误就会消失.


[C++11: 3.5/3]: 具有命名空间作用域(3.3.6)的名称具有内部链接(如果它的名称)

  • 显式声明的变量,函数或函数模板static; 要么,
  • 一个显式声明的变量,constconstexpr既未显式声明extern也未声明具有外部链接的变量 ; 要么
  • 匿名联盟的数据成员.

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

  • 实际上,情况正好相反——您的指针是指向 const 数据的非常量指针。我将它设为 const 指向 const 数据的指针。 (2认同)