Включение неиспользуемых символов в объектные файлы компилятором в C против C ++

Это может быть глупый вопрос, но, возможно, кто-то может дать некоторое представление.

У меня есть некоторые глобальные переменные, определенные в заголовочном файле (да, да, я знаю, что это плохо, но это только гипотетическая ситуация). Я включаю этот заголовочный файл в два исходных файла, которые затем компилируются в два объектных файла. Глобальные символы не упоминаются нигде в коде.

Если исходные файлы - C, то похоже, что компилятор пропускает глобальные символы и все связывается без ошибок. Если исходные файлы - C ++, символы включены в оба объектных файла, и тогда я получаю ошибки компоновщика. Для C ++ я использую extern "C", когда я включаю заголовок.

Я использую компилятор Microsoft от VS2005.

Вот мой код:

Заголовочный файл (test.h):

#ifndef __TEST_H
#define __TEST_H

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

#endif

C Исходные файлы:

test1.c

#include "test.h"

int main( ) {
    return 0;
}

test2.c

#include "test.h"

Исходные файлы C ++:

test1.cpp

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

int main( ) {
    return 0;
}

test2.cpp

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

Для C объектные файлы выглядят примерно так:

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

А для C ++ они выглядят примерно так:

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

Я заметил, что _ptr указан как UNDEF, когда я компилирую источник C, и он определяется, когда я компилирую источник C ++, что приводит к ошибкам компоновщика.

Я понимаю, что это нехорошо в реальной жизни, я просто пытаюсь понять, почему это не так.

Благодарю.

Ответы на вопрос(2)

Ваш ответ на вопрос