Включение неиспользуемых символов в объектные файлы компилятором в 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 ++, что приводит к ошибкам компоновщика.
Я понимаю, что это нехорошо в реальной жизни, я просто пытаюсь понять, почему это не так.
Благодарю.