Разница между sizeof (struct name_of_struct) и sizeof (name_of_struct)?

Каковы различия между:

sizeof(struct name_of_struct)

против

sizeof(name_of_struct)

Возвращаемые значения предмета одинаковы.

Есть ли разница между этими двумя? Даже если это тонко/не важно, я хотел бы знать.

Ответ 1

struct name_of_struct однозначно ссылается на тег struct/class name_of_struct тогда как name_of_struct может быть переменной или именем функции.

Например, в POSIX у вас есть и struct stat и функция с именем stat. Когда вы хотите сослаться на тип struct, вам необходимо ключевое слово struct для устранения неоднозначности (+ plain C требует этого всегда - в обычном C обычные идентификаторы живут в отдельном пространстве имен из тегов struct, а теги struct не проникают в обычные пространство имен идентификаторов, как в C++, если вы явно не перетаскиваете их туда с помощью typedef, как в typedef struct tag{/*...*/} tag;).

Пример:

struct  foo{ char x [256];};
void (*foo)(void);

int structsz(){ return sizeof(struct foo); } //returns 256
int ptrsz(){ return sizeof(foo); } //returns typically 8 or 4

Если это кажется сбивающим с толку, оно в основном существует для обеспечения обратной совместимости с C.

Ответ 2

Насколько я знаю: различие заключается в нотации структуры стиля c и нотации C++.

Ответ 3

И, конечно же,

sizeof name_of_struct

является допустимым выражением, только когда name_of_struct является объектом (а не просто типом); пишу

sizeof(struct name_of_struct)

не скомпилируется, если name_of_struct уже определено (завершенный тип) как структура (или класс). Но подождите, там больше! Если оба существуют, то

sizeof(struct name_of_struct) 

вы получите размер типа, а не объекта, в то время как оба

sizeof(name_of_struct)

а также

(sizeof name_of_struct)

Вы получите размер объекта.