Aufnahme nicht verwendeter Symbole in Objektdateien durch Compiler in C vs C ++

Dies mag eine dumme Frage sein, aber vielleicht kann jemand einen Einblick geben.

Ich habe einige globale Variablen in einer Header-Datei definiert (ja ja, ich weiß, dass das schlecht ist, aber dies ist nur eine hypothetische Situation). Ich füge diese Header-Datei in zwei Quelldateien ein, die dann in zwei Objektdateien kompiliert werden. Die globalen Symbole werden an keiner Stelle im Code referenziert.

Wenn die Quelldateien C sind, sieht es so aus, als würde der Compiler die globalen Symbole und alle Verknüpfungen ohne Fehler weglassen. Wenn die Quelldateien C ++ sind, sind die Symbole in beiden Objektdateien enthalten, und dann erhalte ich Linkerfehler. Für C ++ verwende ich externes "C", wenn ich den Header einbinde.

Ich verwende den Microsoft-Compiler von VS2005.

Hier ist mein Code:

Header-Datei (test.h):

#ifndef __TEST_H
#define __TEST_H

/* declaration in header file */
void *ptr;

#endif

C Quelldateien:

test1.c

#include "test.h"

int main( ) {
    return 0;
}

test2.c

#include "test.h"

C ++ - Quelldateien:

test1.cpp

extern "C" {
#include "test.h"
}

int main( ) {
    return 0;
}

test2.cpp

extern "C" {
#include "test.h"
}

Für C sehen die Objektdateien ungefähr so ​​aus:

Dump of file test1.obj

File Type: COFF OBJECT

COFF SYMBOL TABLE
000 006DC627 ABS    notype       Static       | @comp.id
001 00000001 ABS    notype       Static       | @feat.00
002 00000000 SECT1  notype       Static       | .drectve
    Section length   2F, #relocs    0, #linenums    0, checksum        0
004 00000000 SECT2  notype       Static       | .debug$S
    Section length  228, #relocs    7, #linenums    0, checksum        0
006 00000004 UNDEF  notype       External     | _ptr
007 00000000 SECT3  notype       Static       | .text
    Section length    7, #relocs    0, #linenums    0, checksum 96F779C9
009 00000000 SECT3  notype ()    External     | _main
00A 00000000 SECT4  notype       Static       | .debug$T
    Section length   1C, #relocs    0, #linenums    0, checksum        0

String Table Size = 0x0 bytes

Und für C ++ sehen sie ungefähr so ​​aus:

Dump of file test1.obj

File Type: COFF OBJECT

COFF SYMBOL TABLE
000 006EC627 ABS    notype       Static       | @comp.id
001 00000001 ABS    notype       Static       | @feat.00
002 00000000 SECT1  notype       Static       | .drectve
    Section length   2F, #relocs    0, #linenums    0, checksum        0
004 00000000 SECT2  notype       Static       | .debug$S
    Section length  228, #relocs    7, #linenums    0, checksum        0
006 00000000 SECT3  notype       Static       | .bss
    Section length    4, #relocs    0, #linenums    0, checksum        0
008 00000000 SECT3  notype       External     | _ptr
009 00000000 SECT4  notype       Static       | .text
    Section length    7, #relocs    0, #linenums    0, checksum 96F779C9
00B 00000000 SECT4  notype ()    External     | _main
00C 00000000 SECT5  notype       Static       | .debug$T
    Section length   1C, #relocs    0, #linenums    0, checksum        0

String Table Size = 0x0 bytes

Ich stelle fest, dass _ptr beim Kompilieren der C-Quelle als UNDEF aufgeführt und beim Kompilieren der C ++ - Quelle definiert wird, was zu Linkerfehlern führt.

Ich verstehe, dass dies im wirklichen Leben keine gute Sache ist, ich versuche nur zu verstehen, warum dies anders ist.

Vielen Dank.