Подтвердить что ты не робот

Несовместимость между кодом 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. Почему такая разница?

4b9b3361

Ответ 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, когда применяется к имени типа, возвращается размер любого объекта этого типа.