Поделиться через


Предупреждение компилятора (уровень 1) C4743

Тип имеет разные размеры в файлах "file1" и "file2": size_1 и size_2 байтах

Внешняя переменная, на которую ссылается или определена в двух файлах, имеет разные типы в этих файлах, и компилятор определил, что размер переменной в файле1 отличается от размера переменной в файле2.

Замечания

Существует важный случай, когда это предупреждение может быть выдается для C++. Если объявлять типы классов с одинаковым именем в двух разных файлах, если эти объявления содержат виртуальные функции, а если объявления не совпадают, компилятор может выдавать предупреждение C4744 для таблиц виртуальных функций. Предупреждение возникает из-за двух таблиц виртуальных функций разного размера для одного типа, а компоновщик должен выбрать один из них для включения в исполняемый файл. Возможно, это может привести к тому, что программа вызывает неправильную виртуальную функцию.

Чтобы устранить это предупреждение, используйте одно и то же определение типа или используйте разные имена для типов или переменных.

Пример

Следующий пример приводит к возникновению ошибки C4743. Чтобы скомпилировать его, поместите оба файла в одну папку, а затем выполните следующую команду в командной строке разработчика:

cl /EHsc /W1 /GL /O2 C4743a.cpp C4743b.cpp

Исходный файл C4743a.cpp:

// C4743a.cpp
class C {
public:
    virtual void f1(void);
    virtual void f2(void);
    virtual void f3(void);
};

void C::f1(void) {}
void C::f2(void) {}
void C::f3(void) {}
C q;

Исходный файл C4743b.cpp:

// C4743b.cpp
class C {
public:
    virtual void f1(void);
    virtual void f2(void);
    virtual void f3(void);
    virtual void f4(void);
    virtual void f5(void);
};

void C::f4(void) {}
void C::f5(void) {}
C x;

int main() {}

Чтобы устранить эту проблему, переименуйте один из C классов.