当我读到一些在linux上运行并由gcc编译的代码时,我遇到了这样的声明:
void* (*func_name) _((void *buf, int size))
Run Code Online (Sandbox Code Playgroud)
BGET源代码是:
void bectl _((int (*compact)(bufsize sizereq , int sequence),
void *(*acquire)(bufsize size),
void *(*release)(void *buf),
bufsize pool_incr));
void bectl(compact, acquire, release, pool_incr)
int(*compact) _((bufsize sizereq, int sequence));
void *(*acquire) _((bufsize size));
void (*release) _((void *buf));
bufsize pool_incr;
{
}
Run Code Online (Sandbox Code Playgroud)
问题是我不知道为什么在参数列表之前添加"_".
_ 是一个宏,旨在允许代码使用原型(指定参数类型的函数声明),同时仍然与不支持原型的ANSI前编译器兼容.
请注意,这_是有效的标识符.但是,所有以标识符开头的标识符_都保留在文件范围内使用,因此这是代码可能不可移植的另一个原因.
您正在阅读的代码显然是BGET,可在此处获得.(在您的问题中引用来源会很有帮助.)如果您查看bget.h头文件(最后更新于1995年),您将看到:
#ifndef _
#ifdef PROTOTYPES
#define _(x) x /* If compiler knows prototypes */
#else
#define _(x) () /* It it doesn't */
#endif /* PROTOTYPES */
#endif
Run Code Online (Sandbox Code Playgroud)
21年后的今天,使用的C编译器很少,不支持原型,因此对这些宏的需求基本上已经过时了.但即使是2011年发布的最新ISO C标准,仍然支持旧式的非原型功能.
请注意,源中没有任何实际定义PROTOTYPES宏的内容,因此如果要在启用原型的情况下编译代码(以获得额外的编译时检查),则需要手动编辑makefile,更改此内容:
COPTS = -O
Run Code Online (Sandbox Code Playgroud)
对此:
COPTS = -O -DPROTOTYPES
Run Code Online (Sandbox Code Playgroud)
即使有了这种改变,编译仍然会因为无效的重新声明而失败malloc.代码需要一些工作才能达到现代标准.
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |