我对两个动作表现有任何疑问(无论如何)这个问题很简单,但有一个很大的问题(当有两种方式,哪一个更好)
我想用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);
}
答案 0 :(得分:1)
这两种方式几乎没有任何共同之处。例如,如果您使用宏版本
,则以下代码无效myStructure *p1 = 0;
myStructure *p2 = 0;
p1 = p2; // <- Type mismatch
而typedef
版本将按预期“运行”。这意味着您的宏版本并没有真正定义任何“可重用”的类型。它可能“适用于”某些利基,狭隘和受限制的目的,但它的可用性远不及typedef
版本。
答案 1 :(得分:0)
第二个是很多方面的废话。你不想这样做。
如果仅使用第二个 - 那么想想如何将它传递给函数。你会面临无数的问题 - 其中一个问题如下: -
void fun( myStructure z){
printf("%d\n", z.id);
}
myStructure zz;
zz.id = 666;
fun(zz); <-- error over here.
这会给你错误。
正确的选择是使用typedef
创建上述声明的struct
的类型别名并使用它。
另外一个基本问题是你为什么这样做。这不是实用的方法。
在回复OP的编辑时 - 在我的回复中,OP回答说可以通过指定一个将其作为参数的宏来解决问题。这带来的缺点是现在调试会更加困难。对于大型项目来说,这将更难以合作。
事情是 - 用
struct {
int id;
} a;
您已声明了类型。但是如果你这样做,那么在相同的代码中
struct {
int id;
} b;
它们不会是相同的类型。
那些不能作为函数传递,因为与struct
声明的类型信息无法使用,因此我们可以明确区分哪种类型 - 它是匿名结构,没有名称信息。
每次创建一个以后无法重复使用的类型信息因为匿名而在下一行中不存在类型信息。
来自standard(证明它确实声明了一种类型)
结构类型描述了顺序分配的非空集 成员对象(在某些情况下,是一个不完整的数组), 每个都有一个可选的名称,可能是不同的 类型。
答案 2 :(得分:0)
在这个级别考虑表现是完全错误的。性能问题来自糟糕的算法,做了太多不必要的工作,而且你通常不会优化你甚至无法衡量的东西。
答案 3 :(得分:0)
宏只是一个愚蠢的文字替换 - 宏myStructure
出现的任何地方都将替换为文字struct { int id; }
。如果预期类型名称(例如在函数参数列表中),这在上下文中无效。
这就是typedef
工具存在的原因 - 它允许您为抽象目的创建新的类型名称。这是正确的方式来完成您想要做的事情。宏观版本试图使用扳手作为锤子,或使用螺丝刀作为凿子。这只是工作的错误工具。
在这种情况下,性能考虑无关紧要。