在c中定义数据类型的两种方法。我应该选哪一个?

时间:2011-12-29 09:34:47

标签: c struct typedef

在c语言编程中,我应该支持:

typedef struct
{
    Point_t points[4];
} Quad_t;

在:

typedef Point_t Quad_t[4];

在表现方面?和最佳实践?

请注意Point_t定义如下:

typedef union
{
    struct
    {
        int x;
        int y;
    };
    int coords[2];
} Point_t;

我发现第一种方法在函数传递四边形时更易读,更容易处理,但第二种方法似乎更直接。

另外,我无法感知使用其中任何一个的性能差异,但我假设这是因为我的代码中只有一小部分使用此类型。 (但是,我仍然希望了解未来的这个提示)

非常感谢.③哈桑。

3 个答案:

答案 0 :(得分:3)

我完全同意你在传递函数时关于可读性的论点。一般来说,我认为为普通数组制作typedef会导致代码混乱,我建议不要这样做。

E.g。

typedef int Value[4];

void PassByValue(Value x) // Does it really?
{
    x[0] = x[3];
}

int main(void)
{
    Value x = {1, 2, 3, 4};

    PassByValue(x); // oops - passes a _pointer_ by value
                    // values in x can be changed.
}

虽然实际按值传递一个数组是不正确的(如果没有将它包装在一个结构中就不可能)可能比传递一个指针更昂贵,至少它很明显两者都在发生什么调用站点和函数定义。如果性能是一个问题,那么你可以明确地获取一个结构的地址并传递一个指向它的指针,这有利于在两个站点更明确。

答案 1 :(得分:0)

最好的程度取决于程序员的兴趣和相似之处。然而,一个甚至重要的观点是编码标准,对于大多数程序员来说,第一种方法更具可读性和可理解性。

然而,当您的代码将被其他人使用或者您需要向非C背景的人解释时,第二种方法会更有用。我建议看一下C编程标准,或者一本关于通用编码概念的书(比如Steve McConnell的Code Complete第二版,这是关于编码的最好的书),this link可能有所帮助。

答案 2 :(得分:0)

如果尝试声明指向const Quad_t的指针,则可能遇到this之类的问题。通常,不建议(为简单起见)将数组与typedef混合。