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.