英文:
C: how to return a struct literal without mentioning its type name?
问题
我们可以通过将匿名文字初始化器强制转换为返回类型来从函数中返回结构体字面量:
struct foo f() {
return (struct foo) { .bar = 42 };
}
是否可以在初始化器中完全不提及 struct foo
而实现相同效果?单独的声明:
struct foo result = {
.bar = 42
};
return result;
不可行,因为它仍然显式提及了 struct foo
类型。
是否可以使用 typeof
获取封闭函数的返回类型?我尝试过:
return (typeof(#__func__())) { .bar = 42 };
- 和
return (__auto_type) { .bar = 42 };
但显然 C 的类型推断不会超出单个表达式的范围。
我正在编写一个预处理宏,希望避免为类型提供额外参数。
欢迎提供与 gcc
相关的解决方案。
英文:
We can return struct literal from a function by casting anonymous literal initializer to the return type:
struct foo f() {
return (struct foo) { .bar = 42 };
}
Is it possible without mentioning struct foo
anywhere in the initializer? Separate declaration:
struct foo result = {
.bar = 42
};
return result;
will not do, as it still explicitly mentions the struct foo
type.
Is it possible to get the return type of enclosing function with typeof
? I tried:
return (typeof(#__func__())) { .bar = 42 };
- and
return (__auto_type) { .bar = 42 };
,
but apparently C's type inference doesn't go outside of a single expression.
I'm writing a preprocessor macro and would like to avoid the extra argument for the type.
gcc
specific solutions are welcome.
答案1
得分: 1
不可能。复合字面值的声明(6.7.6)和初始化都需要类型说明符(6.5.2.5、6.7.9)。
英文:
No. It is not possible. Both a declaration (6.7.6) and an initialization of compound literals requires a type specifier (6.5.2.5, 6.7.9).
答案2
得分: 0
根据最新的公开C11标准草案在撰写时的规定,“6.5.2.5 复合文字”(结构体初始化器)如下所示:
由带括号的类型名称后跟花括号括起的初始化器列表组成的后缀表达式是_复合文字_。
(粗体强调为我的添加)。
事实上,与类型转换无关,除了语法类似。
我相信,这是C标准中指定struct
字面值的唯一方式。
英文:
Per the latest public C11 standard draft at the time of writing, "6.5.2.5 Compound literals" (which are struct initializers):
> A postfix expression that consists of a parenthesized type name followed by a brace-enclosed list of initializers is a compound literal.
(bold emphasis is mine).
Indeed, it has nothing to do with type cast, except for similar syntax.
I believe, this is the only way in C standard to specify struct
literals.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论