Włączenie nieużywanych symboli do plików obiektowych przez kompilator w C vs C ++

To może być głupie pytanie, ale być może ktoś może dostarczyć jakiegoś wglądu.

Mam kilka zmiennych globalnych zdefiniowanych w pliku nagłówkowym (tak tak, wiem, że jest źle, ale jest to tylko hipotetyczna sytuacja). Dołączam ten plik nagłówkowy do dwóch plików źródłowych, które są następnie kompilowane w dwa pliki obiektowe. Symbole globalne nie są przywoływane w żadnym miejscu kodu.

Jeśli pliki źródłowe to C, wygląda na to, że kompilator pomija symbole globalne i wszystko łączy się bez błędów. Jeśli pliki źródłowe to C ++, symbole są zawarte w obu plikach obiektowych, a następnie otrzymuję błędy linkera. W C ++ używam extern „C”, gdy dołączam nagłówek.

Używam kompilatora Microsoft z VS2005.

Oto mój kod:

Plik nagłówka (test.h):

#ifndef __TEST_H
#define __TEST_H

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

#endif

C Pliki źródłowe:

test1.c

#include "test.h"

int main( ) {
    return 0;
}

test2.c

#include "test.h"

Pliki źródłowe C ++:

test1.cpp

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

int main( ) {
    return 0;
}

test2.cpp

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

W przypadku C pliki obiektów wyglądają mniej więcej tak:

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

A dla C ++ wyglądają mniej więcej tak:

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

Zauważam, że _ptr jest wymieniony jako UNDEF, gdy kompiluję źródło C i jest ono definiowane podczas kompilacji źródła C ++, co powoduje błędy linkera.

Rozumiem, że nie jest to dobra rzecz do zrobienia w prawdziwym życiu, staram się tylko zrozumieć, dlaczego jest inaczej.

Dzięki.

questionAnswers(2)

yourAnswerToTheQuestion