gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:50:17 26 4
gpt4 key购买 nike

我有一个头文件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

还有许多包含 foo.h 的 cpp 文件。

foo.c bar.c

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

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

所以我有以下两个问题:

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

最佳答案

USB_MANAGER_DBUS_OBJ_PATH#define 在编译单元中是常量,它是文本替换。

TU 中 DBUS_CONNECTION_MAX_RETRY_TIMEconst int 也是常量。 const 使变量只读,它本质上是将其声明为可修改的左值,它有一个implicit internal linkage。 , from这些posts .

const char* USB_MANAGER_DBUS_SERVICE =  "com.USBService";

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

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

const char* const USB_MANAGER_DBUS_SERVICE =  "com.USBService";
// ^^^^^ added const

将是 const

关于c++ - 为什么 C++ 中的多重定义错误不是由 const int 声明引起的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25544436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com