Как определить объект с нулевым адресом? - PullRequest
0 голосов
/ 16 января 2009

Мне интересно, как я могу определить объект в 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.

Ответы [ 11 ]

0 голосов
/ 16 января 2009

Я не думаю, что есть стандартный способ определить что-то, имеющее адрес 0. Или, скорее, оно не определено, так как тогда можно было бы разыменовать 0, которое не определено (или это зависит от платформы?) В стандарте .

Что вы пытаетесь сделать?

...