Мне интересно, как я могу определить объект в C, ссылка на который будет нулевым?
// definition of foo
...
void * bar = &foo; // bar must be null
Есть несколько способов, которые я мог бы найти, чтобы сделать это, но ни один не соответствовал моим потребностям.
__attribute__((weak)) extern int foo; //not working with cygwin/gcc 3.4
__attribute__((at(0))) int foo; //only with rvds
#define foo (*(int*) 0) //cannot be embedded in a macro
На самом деле, я бы предпочел стандартное совместимое решение (c99), но все, что работает
все будет в порядке.
Отредактировано: причина для этого в том, что бар не всегда будет нулевым. Вот более подходящий пример:
// macro that will define foo to a real object or to *null
DECL(foo);
int * bar = &foo;
if(bar) {
// we can call func
func(bar);
} else {
// bar undefined
exit(-1);
}
Конечно, это все еще не очень актуально, потому что я могу использовать #if в моем состоянии. В действительности проект включает в себя большие структуры, множество файлов, несколько компиляторов, несколько целевых процессоров и множество программистов, которые генерируют ошибки с вероятностью, экспоненциальной сложности используемого синтаксиса. Вот почему я хотел бы, чтобы простой макрос объявлял мой объект foo.