Доброго здоровья!
Относительно пустых структур... разные компиляторы ведут себя совершенно по-разному. Основная проблема пустых структур заключается в, как это не странно указателях на них. На что будет нацелен указатель, если вообще нет данных? NULL ?
malloc(sizeof(type)); при размере типа равным нулю вернет значение NULL. Это создает неоднозначность: можно ли использовать результат нуль, или он появился вследствие невозможности выделения памяти.
Например, MSVC спокойно компилирует следующий код:
#include <stdio.h>
struct empty {};
int main(int argc, char* argv[])
{
empty a;
empty c[10];
empty b;
printf("sizeof & pointers\nvar\tsizeof\tpointer\n");
printf("a\t%d\t%x\n", sizeof(a), &a);
printf("c\t%d\t%x\n", sizeof(c), &c);
printf("b\t%d\t%x\n\n", sizeof(b), &b);
printf("alignment\nexpression\tresult\n");
printf("&a - &b\t\t0x%x\n", (&a - &b) );
printf("&a - c\t\t0x%x\n", (&a - c) );
printf("c - &b\t\t0x%x\n", (c - &b) );
printf("&c[9] - c\t0x%x\n", (&c[9] - c) );
printf("&c[9] - &c[0]\t0x%x\n", (&c[9] - &c[0]) );
return 0;
}
---
Результатом является:
sizeof & pointers
var sizeof pointer
a 1 12ff7c
c 10 12ff70
b 1 12ff6c
alignment
expression result
&a - &b 0x10
&a - c 0xc
c - &b 0x4
&c[9] - c 0x9
&c[9] - &c[0] 0x9
---
Интересно получается, но, имхо, GCC ведет себя более правильно - он просто не дает возможности использования пустых структур.
Пример - компиляция маленького файла:
struct empty {};
int main(int argc, char* argv[])
{
empty a;
return &a;
}
---
Она завершается с ошибкой
gcc.c: In function `main':
gcc_c:5: `empty' undeclared (first use in this function)
Может быть, кому-либо не понравится такое решение, но оно явно лучше, чем в MSVC - программа не захламляется ненужными конструкциями. По логике вещей с пустой структурой делать нечего. Она вообще не должна использоваться.
|