Это ошибка VC ++ 2010? О объявлении постоянного объекта в заголовке - PullRequest
0 голосов
/ 15 ноября 2010

Несколько строк кода стоят тысячи слов:

У меня есть три простых файла: 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 ++говорит: (на странице 140 из n3126)

    "Объекты, объявленные как const и явно не объявленные extern, имеют внутреннюю связь."1021 * говорит :

    "В C значения констант по умолчанию имеют внешнюю связь, поэтому они могут появляться только в исходных файлах. В C ++ значения констант по умолчанию имеют внутреннюю связь, что позволяетпоявляются в заголовочных файлах.

    Ключевое слово const также можно использовать в объявлениях указателей. "

Ответы [ 3 ]

3 голосов
/ 15 ноября 2010

const void *p = 0; определяет p как указатель на const void, но не определяет само p как const вообще. Поскольку ваш p не является const объектом, правило, присваивающее ему внутреннюю связь, не применяется, поэтому оно имеет внешнюю связь.

void *const p = 0; определит p как указатель на константу. void const * const p будет определять p как константный указатель на const void.

2 голосов
/ 15 ноября 2010

Если вы определяете переменную в заголовочном файле, который включается более одного раза, компоновщик находит определение для каждого включения. Вы должны объявить переменную в заголовочном файле и определить ее один раз и только один раз в одном файле .cpp.

Заголовочный файл:

extern const void* p;

cpp файл:

const void* p = 0;
0 голосов
/ 15 ноября 2010

Может быть, это void * const p?

...