Discussion:
Is this a BUG of VC++ 2010? About declaring a constant object in a header.
(too old to reply)
xmllmx
2010-11-15 14:09:19 UTC
Permalink
Several lines of code are woth a thousand words:

I have three simple files: 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 ====

When compiling the simplest project, the VC++ 2010 complains as
follows:

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
==========

I am sure this is a bug of VC++ 2010, because of the following two
references:

#1, The C++ standard says: (at page 140 of n3126)

"Objects declared const and not explicitly declared extern have
internal linkage."

#2, The MSDN says: (at: http://msdn.microsoft.com/en-us/library/357syhfh(VS.80).aspx)

"In C, constant values default to external linkage, so they can
appear only in source files. In C++, constant values default to
internal linkage, which allows them to appear in header files.

The const keyword can also be used in pointer declarations."
Ulrich Eckhardt
2010-11-16 08:09:29 UTC
Permalink
Post by xmllmx
// header.h
[...]
Post by xmllmx
const void* p = 0;
[linker error due to multiple definition of p]

This is not a constant object. See the FAQ at parashift's.

Uli
--
C++ FAQ: http://parashift.com/c++-faq-lite

Sator Laser GmbH
Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932
Loading...