这是VC ++ 2010的BUG吗?关于在标头中声明一个常量对象

时间:2010-11-15 14:29:09

标签: visual-c++ compile-time-constant

几行代码值得千言万语:

我有三个简单的文件: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的一个错误,因为有以下两个引用:

  1. C ++标准说:(在n3126的第140页)

      

    “对象声明为const而不是   明确声明extern有   内部联系。“

  2. MSDN says

      

    “在C中,常量值默认为   外部联系,所以他们可以出现   仅在源文件中。在C ++中,常量   值默认为内部链接,   这允许它们出现在标题中   文件。

         

    也可以使用const关键字   在指针声明中。“

3 个答案:

答案 0 :(得分:3)

const void *p = 0;p定义为 const void的指针,但定义p本身是const一点都没有。由于您的p不是const对象,因此内部链接的规则不适用,因此它具有外部链接。

void *const p = 0;会将p定义为const指针。 void const * const pp定义为const void的const指针。

答案 1 :(得分:2)

如果在包含多次的头文件中定义变量,链接器将为每个包含找到定义。你应该在一个.cpp文件中声明头文件中的变量一次定义一次。

标题文件:

extern const void* p;

cpp文件:

const void* p = 0;

答案 2 :(得分:0)

也许它应该是无效的* const p?