C使用typedef或#define定义结构[关闭]

问题描述 投票:-10回答:4

我有两个动作表现的问题(以任何方式)这个问题很简单,但有很大的问题(当有两种方式,哪一个更好)我想用C语言创建结构。这对我来说是两个选择 1-在.h文件中定义它并在程序中使用它

typedef struct {
    int id;
} myStructure;

2 - 使用这种定义来定义这个结构

#define myStructure struct { int id; }

哪种方式更好?我知道我们使用的方式还有1个,但我不知道为什么我认为第二种方式是母亲的定义方式请比较这些方式(无论如何表现)

更新1: 谢谢您的回答。在最后2个响应中我得到了这个原因,如果我们想在函数参数中使用该变量,我们就不能使用第二种方式。这是真的,但有一点。我们也可以将这个功能作为宏功能来解决这个问题。这样的事情

#define myStructure struct { int id; }
#define FUNC(__MYSTRUCTURE)     printf("%d", __MYSTRUCTURE.id)
int main() {
myStructure var1;
var1.id = 542;
FUNC(var1);
}
c struct structure
4个回答
0
投票

那么第二个在很多方面都是胡说八道。你不想那样做。

第二个如果只使用 - 然后想想如何将它传递给函数。您将面临无数问题 - 其中一个问题如下: -

void fun( myStructure z){
    printf("%d\n", z.id);
}

 myStructure zz;
 zz.id = 666;
 fun(zz);  <-- error over here.

这会给你错误。

正确的选择是使用typedef创建上述声明的struct的类型别名并使用它。另外一个基本问题是你为什么这样做。这不是实用的方法。

Edit:

在回复OP的编辑时 - 在我的回复中,OP回答说可以通过指定一个将其作为参数的宏来解决问题。这带来的缺点是现在调试会更加困难。对于大型项目来说,这将更难以合作。


事情是 - 用

struct {
  int id;
} a;

您已声明了一种类型。但是如果你这样做,那么在相同的代码中

struct {
int id;
} b;

它们不是同一类型。

那些不能作为函数传递,因为无法使用与声明的struct相关联的类型信息,因此我们可以明确区分哪个是什么类型 - 它是没有名称信息的匿名结构。

由于匿名性,每次创建一个以后无法重用的类型信息作为类型信息都不会在下一行中出现。

来自standard(证明它确实声明了一种类型)

结构类型描述顺序分配的非空成员对象集(并且在某些情况下,是不完整的数组),每个成员对象具有可选地指定的名称并且可能具有不同的类型。


1
投票

这两种方式几乎没有任何共同之处。例如,如果您使用宏版本,则以下代码无效

myStructure *p1 = 0;
myStructure *p2 = 0;
p1 = p2; // <- Type mismatch

typedef版本将表现“按预期”。这意味着您的宏版本并没有真正定义任何“可重用”的类型。它可能“适用于”某些利基,狭隘和受限制的目的,但它的可用性远不及typedef版本。


0
投票

对这一级别的表现的思考是完全错误的。性能问题来自糟糕的算法,做了太多不必要的工作,而且你通常不会优化你甚至无法衡量的东西。

http://wiki.c2.com/?PrematureOptimization


0
投票

一个宏只是一个愚蠢的文本替换 - 宏myStructure出现的每个地方都将被文本struct { int id; }取代。如果期望类型名称(例如在函数参数列表中),这在上下文中将无效。

这就是typedef工具存在的原因 - 它允许您为抽象目的创建新的类型名称。这是完成你想要做的事情的正确方法。宏观版本试图使用扳手作为锤子,或使用螺丝刀作为凿子。这只是工作的错误工具。

在这种情况下,性能考虑无关紧要。

© www.soinside.com 2019 - 2024. All rights reserved.