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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage