Несовместимость кода C и C ++ - PullRequest
17 голосов
/ 19 марта 2011

данный код 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-битной реализации, тогда как в C ++ код

#include <iostream>
int x = 14;    
size_t check()
{
   struct x {};
   return sizeof(x); // which x    
}
int main()
{
    std::cout<< check(); 
    return 0;
}

выходов 1. Почему такая разница?

Ответы [ 4 ]

25 голосов
/ 19 марта 2011

В объявлении класса C ++ struct x {}; вводит имя x в область действия check и скрывает x (ранее объявленный как int в области видимости файла). Вы получаете 1 как вывод, потому что размер пустого класса не может быть нулем в C ++ .

В C объявление внутренней области имени тега struct никогда не скрывает имя объекта или функции во внешней области. Вам необходимо использовать имя тега struct для ссылки на имя типа x (struct) , Однако вы не можете иметь пустую структуру в C, так как это нарушает синтаксические ограничения для struct (однако gcc поддерживает ее как расширение).

7 голосов
/ 19 марта 2011

В C теги struct находятся в отдельном пространстве имен, и вам нужно использовать ключевое слово struct для доступа к именам в них. По этой причине идиома «typedef struct {} x» так популярна в C - она ​​позволяет вам существенно продвигать имена структур в глобальное пространство имен.

В C ++, напротив, структуры (и все другие имена) живут в пространстве имен, окружающем объявление, а не в отдельном пространстве имен struct tag, как в C.

Как сказал Саураб, используйте sizeof (struct x) в C или используйте трюк typedef struct {} x, чтобы sizeof (x) работал так же, как в C ++.

В качестве дополнительного бонуса программа C ++ выводит 1, потому что конкретные объекты класса должны иметь ненулевой размер (чтобы разные объекты имели разные адреса), поэтому компилятор дополнил структуру анонимным значением char.

7 голосов
/ 19 марта 2011

Код на C дает вам размер глобальной переменной 'x', тогда как код на C ++ дает размер пустой структуры.Чтобы получить размер struct x в коде C, используйте sizeof (struct x)

0 голосов
/ 19 марта 2011

В C я не думаю, что вы можете ссылаться на тип (то есть struct x) напрямую, используя только его имя.Вы должны создать объект этого типа и запустить над ним sizeof.

В C ++ sizeof при применении к имени типа возвращает размер любого объекта этого типа.

...