为什么C++中的多重定义错误不是由const int声明引起的?

Pet*_*ter 2 c++ linker

我有一个头文件foo.h

#ifndef __FOO_H__
#define __FOO_H__

const char* USB_MANAGER_DBUS_SERVICE =  "com.USBService";
#define  USB_MANAGER_DBUS_OBJ_PATH  "/com/USB/MgrObject"
const int  DBUS_CONNECTION_MAX_RETRY_TIME  = 5;

#endif
Run Code Online (Sandbox Code Playgroud)

以及许多包含foo.h.

foo.c bar.c
Run Code Online (Sandbox Code Playgroud)

当它们一起编译时,出现“多重定义错误”。

Linking CXX shared library:
foo.cpp.o:(.data.rel.local+0x0): multiple definition of `USB_MANAGER_DBUS_SERVICE'
bar.cpp.o:(.data.rel.local+0x0): first defined here
Run Code Online (Sandbox Code Playgroud)

所以我有以下两个问题:

  1. 为什么不会#define导致链接错误?
  2. 为什么不会const int导致链接错误?

Nia*_*all 5

for在#define各个USB_MANAGER_DBUS_OBJ_PATH编译单元中是不变的,它是文本替换。

const intTU 中的for常数也是如此DBUS_CONNECTION_MAX_RETRY_TIME。使const变量只读,它本质上没有将其声明为可修改的左值,它具有隐式内部链接来自这些帖子

const char* USB_MANAGER_DBUS_SERVICE =  "com.USBService";
Run Code Online (Sandbox Code Playgroud)

为什么会USB_MANAGER_DBUS_SERVICE导致链接器错误?

它不是const,因为指针不是一个常量值,而只是指向的值。

const char* const USB_MANAGER_DBUS_SERVICE =  "com.USBService";
//          ^^^^^ added const
Run Code Online (Sandbox Code Playgroud)

将会const