几行代码值得千言万语:
我有三个简单的文件:header.h,main.cpp,other.cpp
==== CODE BEGIN ====
// header.h
#pragma once
const void* p = 0;
// main.cpp
#include "header.h"
int main()
{
return 0;
}
// other.cpp
#include "header.h"
==== CODE END ====
编译最简单的项目时,VC ++ 2010抱怨如下:
ClCompile:
other.cpp
main.cpp
Generating Code...
other.obj : error LNK2005: "void const * const p" (?p@@3PBXB) already defined in main.obj
D:\Test\Debug\bug.exe : fatal error LNK1169: one or more multiply defined symbols found
Build FAILED.
Time Elapsed 00:00:00.29
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我确信这是VC ++ 2010的一个错误,因为有以下两个引用:
C ++标准说:(在n3126的第140页)
“对象声明为const而不是 明确声明extern有 内部联系。“
MSDN says:
“在C中,常量值默认为 外部联系,所以他们可以出现 仅在源文件中。在C ++中,常量 值默认为内部链接, 这允许它们出现在标题中 文件。
也可以使用const关键字 在指针声明中。“
答案 0 :(得分:3)
const void *p = 0;
将p
定义为到 const void
的指针,但不定义p
本身是const
一点都没有。由于您的p
不是const
对象,因此内部链接的规则不适用,因此它具有外部链接。
void *const p = 0;
会将p
定义为const指针。 void const * const p
将p
定义为const void的const指针。
答案 1 :(得分:2)
如果在包含多次的头文件中定义变量,链接器将为每个包含找到定义。你应该在一个.cpp文件中声明头文件中的变量一次定义一次。
标题文件:
extern const void* p;
cpp文件:
const void* p = 0;
答案 2 :(得分:0)
也许它应该是无效的* const p?