Это лягушка? анонимные структуры для 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
в объявлении вашей переменной.
Пожалуйста, покажите нам больше кода.
В соответствии с
Под 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
Так что теперь вы делаете что-то еще, что случайное поведение для вас..