我得到了全局
的上述消息链接器错误const char* HOST_NAME = "127.0.0.1";
我不认为我已经编译了两次文件但是这里是我对文件的定义。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include "connection.hpp"
#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"
#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
任何帮助?
答案 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
部分,并在一个源文件中提供定义。