> Доброго здоровья! > Относительно пустых структур... разные компиляторы ведут > себя совершенно по-разному. Основная проблема пустых > структур заключается в, как это не странно указателях на > них. На что будет нацелен указатель, если вообще нет > данных? NULL ?
А на что нацелен (void *)?
> malloc(sizeof(type)); при размере типа > равным нулю вернет значение NULL. Это создает > неоднозначность: можно ли использовать результат нуль, или > он появился вследствие невозможности выделения памяти.
А по фигу.
> Например, MSVC спокойно компилирует > следующий код:
[skipped]
gcc его тоже преотлично компилирует
С примерно тем же результатом (указатели другие, но они есть):
sizeof & pointers
var sizeof pointer
a 1 22ff6f
c 10 22ff50
b 1 22ff4f
alignment
expression result
&a - &b 0x20
&a - c 0x1f
c - &b 0x1
&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)
Это синтаксическая ошибка. Некоторые расширения C позволяют опускать ключевое слово struct (union, enum), но стандартно этого делать нельзя.
код
struct empty {};
int main(int argc, char* argv[])
{
struct empty a;
return &a;
} ---
Прекрасно компилируется на gcc:
test.c: In function `main':
test.c:5: warning: return makes integer from pointer without a cast
test.c:5: warning: function returns address of local variable
> Может быть, кому-либо не понравится такое решение, но оно > явно лучше, чем в MSVC - программа не захламляется > ненужными конструкциями. По логике вещей с пустой > структурой делать нечего. Она вообще не должна > использоваться.
И еще одно. Скорее всего где то в стандарте это оговорено. Ибо
$ cat >test.c
#include <stdio.h>
struct empty {};
int
main() {
printf("%d\n", sizeof(struct empty));
}
$ gcc -x c -o test.exe test.c; test.exe
0
$ gcc -x c++ -o test.exe test.c; test.exe
1
$ cl -nologo -Tc test.c; test.exe
test.c
test.c(3) : error C2059: syntax error : '}'
test.c(7) : error C2027: use of undefined type 'empty'
test.c(3) : see declaration of 'empty'
$ cl -nologo -Tp test.c; test.exe
test.c
1
---
Я так и не заставил vc скомпилять этот текст в C-шном режиме (а в cpp он его съел с удовольствием)
|