函数原型 typedef 可以在函数定义中使用吗?

2024-02-05

我有一系列具有相同原型的函数,比如说

int func1(int a, int b) {
  // ...
}
int func2(int a, int b) {
  // ...
}
// ...

现在,我想简化它们的定义和声明。当然我可以使用这样的宏:

#define SP_FUNC(name) int name(int a, int b)

但我想将其保留在 C 中,所以我尝试使用存储说明符typedef为了这:

typedef int SpFunc(int a, int b);

这对于声明来说似乎效果很好:

SpFunc func1; // compiles

但不适用于定义:

SpFunc func1 {
  // ...
}

这给了我以下错误:

error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token

有没有办法正确地做到这一点还是不可能? 根据我对 C 的理解,这应该可行,但事实并非如此。为什么?


注意,gcc 理解我想要做什么,因为,如果我写

SpFunc func1 = { /* ... */ }

它告诉我

error: function 'func1' is initialized like a variable

这意味着 gcc 理解 SpFunc 是一种函数类型。


您不能使用函数类型的 typedef 来定义函数。这是明确禁止的 - 请参阅 6.9.1/2 和相关脚注:

函数定义中声明的标识符(即函数的名称)应 有一个函数类型,由函数定义的声明符部分指定。

其目的是函数定义中的类型类别不能从 typedef 继承:

typedef int F(void); // type F is "function with no parameters
                     // returning int"
F f, g; // f and g both have type compatible with F
F f { /* ... */ } // WRONG: syntax/constraint error
F g() { /* ... */ } // WRONG: declares that g returns a function
int f(void) { /* ... */ } // RIGHT: f has type compatible with F
int g() { /* ... */ } // RIGHT: g has type compatible with F
F *e(void) { /* ... */ } // e returns a pointer to a function
F *((e))(void) { /* ... */ } // same: parentheses irrelevant
int (*fp)(void); // fp points to a function that has type F
F *Fp; //Fp points to a function that has type F
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数原型 typedef 可以在函数定义中使用吗? 的相关文章

随机推荐

  • 使用命令行参数从 python 制作 exe 文件

    我想从使用命令行参数 argv 的 python 脚本创建一个 exe据我所知 py2exe 不支持命令行参数 我能做些什么 编辑 我使用的是 GUI2Exe 工具 所以我错过了控制台标志 但接受的答案是完全正确的 setup consol
  • PHP 正斜杠匹配

    PHP 中如何检查某个字符串是否包含正斜杠 检查是否出现strpos http php net manual en function strpos php if strpos string FALSE Found 以整数形式返回位置 如果未
  • 如何读取 git-ls-tree 输出的模式字段

    git ls tree fb3a8bdd0ce 100644 blob 63c918c667fa005ff12ad89437f2fdc80926e21c gitignore 100644 blob 5529b198e8d14decbe4ad
  • CSS 中类的通配符 *

    我有这些我正在设计的 div tocolor 但我还需要唯一标识符 1 2 3 4 等 因此我将其添加为另一个类tocolor 1 div class tocolor tocolor 1 tocolor 1 div div class to
  • 使用 C++ WinAPI 在 Windows 10 上设置亮度

    我正在尝试在 Windows 10 计算机上设置亮度 显示器好像不支持setMonitorBrightness and setDeviceGammaRamp改变伽玛 白点等 所以我尽量不使用它 我正在尝试使用它来使其工作IOCTL VIDE
  • SendGrid API 动态 - 无法取消订阅工作

    我刚刚使用 sendgrid 设置了一封动态电子邮件 并使用 API 根据我的客户数据填写它 除了取消订阅部分之外 我已经完成了所有工作 我的电子邮件底部有一个取消订阅块 在代码编辑器中 代码如下所示 div class module st
  • Spark Streaming 无法从单个文件读取流数据

    我正在尝试从使用 Spark 流 API textFileStream 连续附加的文本文件中读取流数据 但无法使用 Spark Streaming 读取连续数据 Spark中如何实现呢 这是预期的行为 为了基于文件的源 https spar
  • 如何检索每个轴上的 3D 旋转角度?

    我有一个 Model3DGroup 它使用应用于对象的 Transform 属性的 AxisAngleRotation3D 围绕任何 x y z 轴旋转 问题是我无法控制网格上应用的各种旋转 我需要在每个渲染循环的 x y z 轴上显示网格
  • 在chrome新版本上使用window.open显示base64 pdf数据

    我正在使用以下代码在新窗口中以 pdf 形式打开 Base64 数据 var pdf response data base64 var doc document createElement a doc href data applicati
  • Scala 中单例对象的解释

    我得到的编码是 您基本上提供了一个 object SomeClass 和一个 class SomeClass 并且伴随类是类声明 而对象是单例 http en wikipedia org wiki Singleton pattern 您无法
  • OpenCV。如何将点与矩阵相乘 (CvMat)

    我有用于旋转的矩阵 CvMat rot mat cvCreateMat 2 3 CV 32FC1 cv2DRotationMatrix center angle scale rot mat 该矩阵用于图像操作 cvWarpAffine ro
  • 如何使用 MySQL 和 PHP 比较一组数字并获得最相关的结果?

    考虑一下 set A 1 2 3 4 set B 3 4 5 6 set C 4 5 6 7 set D 1 我想将 D 与其余的进行比较 并得出一组最相关的数字 结果应按以下顺序排列 4 因为 D 与 A 有公共数 4 在 A 中 也在
  • 使用 JQuery 渲染部分视图时遇到问题

    我有一个如下所示的区域 以下是控制器操作 HttpGet public ActionResult Index partial return PartialView PartialPage1 HttpGet public ActionResu
  • 调试为什么我在 Apache 2.4 中收到“您没有访问权限”

    我正在尝试在 Linux Ubuntu 中创建本地环境 我已经安装了 Apache 2 4 7 使用 apt get 我已将 etc hosts 更改为 127 0 0 1 example dev 127 0 0 1 localhost 我
  • Azure cloud-init:无法安装包

    我有一个简单的 cloud init 文件 cloud config package upgrade true packages symlinks wget rsync git 但我的 Azure 失败 最后提供日志 这是我第一次在 Azu
  • 通过 Python 注释和取消注释 XML

    我想知道一种使用 Python 注释和取消注释 XML 中的元素的方法
  • 创建 Maven ArcheType 。设置文件名

    我想创建一个原型 用户可以在其中提供artifactId 然后我想拿这个artifactId并创建两个文件 这是一个例子 artifactId box FILE 1 copy box txt FILE 2 Box java 创造copy b
  • 项目符号列表行之间的间距

    如何设置项目符号列表之间的间距 asdfasdf asdf23223 我想在第一行和第二行之间留出更多空间 例如 ul li asdfasdf li p p li asdf23223 li ul Add top and bottom填充到l
  • 使用 MediaRecorder 写入缓冲区或 FIFO

    我正在开发一个低数据速率 VoIP 类型的项目 我需要以低数据速率捕获音频并将其存储在内部缓冲区或 FIFO 中 而不是文件中 我想使用低数据速率 AMR 编码器 这意味着 AudioRecord 已经过时了 MediaRecorder 看
  • 函数原型 typedef 可以在函数定义中使用吗?

    我有一系列具有相同原型的函数 比如说 int func1 int a int b int func2 int a int b 现在 我想简化它们的定义和声明 当然我可以使用这样的宏 define SP FUNC name int name