Несовместимость между кодом C и С++
Данный код C
#include <stdio.h>
int x = 14;
size_t check()
{
struct x {};
return sizeof(x); // which x
}
int main()
{
printf("%zu",check());
return 0;
}
дает 4 в качестве вывода в C для моей 32-битной реализации, тогда как в С++ код
#include <iostream>
int x = 14;
size_t check()
{
struct x {};
return sizeof(x); // which x
}
int main()
{
std::cout<< check();
return 0;
}
1. Почему такая разница?
Ответы
Ответ 1
В объявлении класса С++ struct x {};
вводится имя x
в область check
и скрывается x
(ранее объявлено как int
в области файла). Вы получаете 1 как результат, потому что размер пустого класса не может быть нулевым в С++.
В C объявление внутренней области имени тэга struct никогда не скрывает имя объекта или функции во внешней области. Вам нужно использовать имя тега struct
, чтобы ссылаться на имя типа x
(struct), Однако вы не можете иметь пустую структуру в C как она нарушает синтаксические ограничения на struct (однако gcc поддерживает ее как расширение).
Ответ 2
Код C дает вам размер глобальной переменной "x", тогда как код С++ задает размер пустой структуры.
Чтобы получить размер структуры x в коде C, используйте sizeof (struct x)
Ответ 3
В C теги struct живут в отдельном пространстве имен, и вам нужно использовать ключевое слово struct для доступа к именам там. Именно по этой причине "typedef struct {} x" идиома настолько популярна в C - она позволяет существенно продвигать имена структур в глобальное пространство имен.
В С++, напротив, структуры (и все другие имена) живут в пространстве имен, окружающих объявление, а не в отдельном пространстве имен тэгов struct, как в C.
Как сказал Саурабб, используйте sizeof (struct x) в C или используйте трюк typedef struct {} x
, чтобы получить sizeof (x) для работы как в С++.
В качестве дополнительного бонуса программа С++ выводит 1, потому что конкретные объекты класса должны иметь ненулевой размер (так что разные объекты должны иметь разные адреса), поэтому компилятор заполнил структуру анонимным значением char.
Ответ 4
В C я не думаю, что вы можете ссылаться на тип (т.е. struct x
) напрямую, используя только его имя. Вы должны создать объект этого типа и запустить sizeof
над ним.
В С++ sizeof
, когда применяется к имени типа, возвращается размер любого объекта этого типа.