Это лягушка? анонимные структуры для typedef

У меня был этот typedef для структуры вроде

typedef struct { double x, y; } ACVector;

и когда я смотрю на экземпляры этого в отладчике, я получаю очень странный вывод что-то вроде

(lldb) p _translation
(ACVector) $1 = {
  (double) x = -5503.61
  (double) y = -5503.61
  (CLLocationDegrees) latitude = -5503.61
  (CLLocationDegrees) longitude = -1315.67
}

(lldb) p _translation.x
(double) $2 = -5503.61
(lldb) p _translation.y
(double) $2 = -5503.61

если я изменю определение ACVector на

typedef struct ACVector { double x, y; } ACVector;

и сделать то же самое в отладчике, я получаю то, что я ожидаю

(lldb) p _translation
(ACVector) $1 = {
  (double) x = -5503.61
  (double) y = -1315.67
}

Допустимо использовать анонимные структуры для typedef

ОК, так что больше кода

объявление _translation является переменной экземпляра

ACVector    _translation;

Я использую эту функцию для инициализации переменной

ACVector ACVectorMake( double x, double y )
{
    ACVector    r;
    r.x = x;
    r.y = y;
    return r;
}

Как это

_translation = ACVectorMake( d[xp[0]].x-s[xp[0]].x,  d[xp[0]].y-s[xp[0]].y );

Первоначально это был

ACVector ACVectorMake( double x, double y )
{
    return (ACVector){x,y};
}

И откуда в выводе отладчика появятся элементы широты и долготы, учтите, что вы не можете получить к ним доступ по отдельности.

Больше информации в ответ на ACVector определено где-то еще

У меня есть два определения

#define ACVectorZero        (ACVector){(double)0.0,(double)0.0}
#define ACVectorUnit        (ACVector){(double)1.0,(double)1.0}

которые интересно сопровождаются непосредственно

#define ACDegreesFromDegreesMinutesSeconds( d, m, s )                       (CLLocationDegrees)(d+m/60.0+s/3600.0)
#define ACLocationFromDegreesMinutesSeconds( yd, ym, ys, xd, xm, xs )       (CLLocationCoordinate2D){ACDegreesFromDegreesMinutesSeconds( xd, xm, xs ), ACDegreesFromDegreesMinutesSeconds( yd, ym, ys )}

что может объяснить, возможно, объяснить возникновение широты и долготы в ACVector

Выполнял поиск всех вхождений ACVector, в том числе в библиотеках, не мог найти другие вхождения определяемого ACVector

Это все с использованием Xcode 4.5 Gold Master

2 ответа

Держу пари, что вы, вероятно, используете struct ACVector _translation вместо ACVector _translation в объявлении вашей переменной.

Пожалуйста, покажите нам больше кода.

В соответствии с

Стандарт языка C n1256

Под 6.7.4 Спецификаторы функций

12
The one exception allows the value of a restricted pointer to be carried
 out of the block in which it (or, more
precisely, the ordinary identifier used to designate it) is declared when
that block finishes execution. 

Например, это позволяет new_vector возвращать вектор.

typedef struct { int n; float * restrict v; } vector;
vector new_vector(int n)
{
vector t;
t.n = n;
t.v = malloc(n * sizeof (float));
return t;
}

Так что да, теперь мы можем сказать,

Допустимо использовать анонимные структуры для typedef

Так что теперь вы делаете что-то еще, что случайное поведение для вас..

Другие вопросы по тегам