不带 typedef 的 C 函数类型

C function type without a typedef

提问人:ngn 提问时间:8/15/2023 最后编辑:Vlad from Moscowngn 更新时间:8/15/2023 访问量:125

问:

假设我们有许多具有相同签名和返回类型的 C 函数:

R f(X x,Y y){...}
R g(X x,Y y){...}
R h(X x,Y y){...}

其中 和 是参数的类型,是结果的类型。XYR

我们可以声明这些函数,例如在头文件中或作为正向声明,如下所示:

R f(X,Y);R g(X,Y);R h(X,Y);

或更简洁地说:

R f(X,Y),g(X,Y),h(X,Y);

或者,避免大多数重复:

typedef R F(X,Y);
F f,g,h;

这可以在一个语句中完成,而没有单独的语句吗?typedef

C 功能-声明

评论

7赞 Cubic 8/15/2023
除了代码高尔夫之外,真的有理由避免这种重复吗?
3赞 Lundin 8/15/2023
“在单个语句中完成”解决了什么问题?你是代码高尔夫还是什么?
3赞 Lundin 8/15/2023
@ngn 事实并非如此。 是完全无法阅读的胡言乱语。对于混淆 C 的热爱,请不要将“不要重复自己”的范式置于“保持愚蠢的简单”之上。前者有一些优点,但如果走极端,它会导致危险的、有缺陷的和不可读的代码。R f(X,Y),g(X,Y),h(X,Y);
2赞 Support Ukraine 8/15/2023
坏主意,非常非常坏主意。
2赞 John Bollinger 8/15/2023
"不喜欢看起来不熟悉的代码“,@ngn?真?居高临下地对待你正在寻求答案的专家很少是一个明智的策略。

答:

-1赞 Wildptr 8/15/2023 #1

头.h

#pragma once

int f(int, int), g(int, int), h(int, int);

头.c

#include "head.h"

int f(int x, int y) { return 0; }
int g(int x, int y) { return 0; }
int h(int x, int y) { return 0; }

主.c

#include <iostream>
#include "head.h"

int main()
{
    f(1, 2);
    return 0;
}

评论

0赞 julaine 8/15/2023
从技术上讲,这是一个单行解决方案,但它比问题中的两行解决方案具有更多的重复性。
1赞 Darth-CodeX 8/15/2023
为什么在文件中,也许你的意思是?iostream*.cstdio.h
2赞 John Bollinger 8/15/2023
OP 在问题中已经有了这一点(标题中的声明)。显然,他们正在寻找不同的东西。
1赞 Vlad from Moscow 8/15/2023 #2

我还没有检查过,但也许在 C23 中可以写

typeof( R( X, Y ) ) f, g, h;

评论

1赞 0___________ 8/15/2023
|如果你没有检查,你为什么要检查?
0赞 Vlad from Moscow 8/15/2023
@0___________我目前无法检查它,但是如果您或其他人可以检查您,或者他可以在评论中例如写下它是无效的。在这种情况下,我将删除我的答案:)
0赞 Lundin 8/15/2023
虽然这实际上只是另一个名字的 typedef。typeof 和 typedef 之间的主要区别在于 typeof 不向后兼容。
1赞 Vlad from Moscow 8/17/2023
@ngn 正如答案中所指出的,它现在是 C23 标准功能。