这是一个铿锵的bug吗? typedef的匿名结构

时间:2012-09-19 11:58:51

标签: c struct clang typedef anonymous-struct

我有一个像

这样的结构的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 个答案:

答案 0 :(得分:0)

我敢打赌,您可能在变量声明中使用struct ACVector _translation而不是ACVector _translation

请向我们展示更多代码。

答案 1 :(得分:0)

根据

C language standard 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

使用匿名结构是合法的

所以现在你正在为你做其他一些意想不到的行为......