我有一个头文件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)
所以我有以下两个问题:
#define导致链接错误?const int导致链接错误?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。