函数定义中单写一行函数名称自身,有什么含义?

justkk 2012-12-24 04:58:25
static int
stonith_signal_set_simple_handler(int sig, void (*handler)(int)
, struct sigaction *oldact);

static int
stonith_signal_set_simple_handler(int sig, void (*handler)(int)
, struct sigaction *oldact)
{
struct sigaction sa;
sigset_t mask;

(void)stonith_signal_set_simple_handler;
if(sigemptyset(&mask) < 0) {
return(-1);
}

sa.sa_handler = handler;
sa.sa_mask = mask;
sa.sa_flags = 0;

if(sigaction(sig, &sa, oldact) < 0) {
return(-1);
}

return(0);
}

#define STONITH_SIGNAL(_sig, _handler) \
stonith_signal_set_simple_handler((_sig), (_handler), NULL)

请问,上面标红的那行语句有什么含义?
...全文
507 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
flxue 2012-12-25
  • 打赏
  • 举报
回复
引用 17 楼 justkk 的回复:
引用 15 楼 mymtom 的回复: 不过有点奇怪: 如果是stonith_signal_set_simple_handler是static的,但是又没有函数调用它,难么这个函数有什么用呢? …… 在别的文件中有对这个函数的调用。 消除未使用的警告,这个解释貌似比较合理
C中static可以跨文件访问? 也表示不理解,不过感觉有些认同4楼的
zhuyf87 2012-12-25
  • 打赏
  • 举报
回复
除了消除“未使用”的警告,想不出还有什么别的功能。顶10楼。
justkk 2012-12-25
  • 打赏
  • 举报
回复
引用 15 楼 mymtom 的回复:
10楼说的有道理,这里的原因在于 stonith_signal_set_simple_handler是static的,如果在本编译单元里不使用的话,用gcc -Wall 编译的话就会有以下的警告: warning: 'stonith_signal_set_simple_handler' defined but not used 所以加上了(void)stonith_signal_set_……
这段代码是在一个.h文件中,需要使用这个函数的.c文件就include这个头文件
justkk 2012-12-25
  • 打赏
  • 举报
回复
引用 15 楼 mymtom 的回复:
不过有点奇怪: 如果是stonith_signal_set_simple_handler是static的,但是又没有函数调用它,难么这个函数有什么用呢? ……
在别的文件中有对这个函数的调用。 消除未使用的警告,这个解释貌似比较合理
dukong123 2012-12-25
  • 打赏
  • 举报
回复
消除未使用警告 ------------------
mymtom 2012-12-25
  • 打赏
  • 举报
回复
10楼说的有道理,这里的原因在于 stonith_signal_set_simple_handler是static的,如果在本编译单元里不使用的话,用gcc -Wall 编译的话就会有以下的警告: warning: 'stonith_signal_set_simple_handler' defined but not used 所以加上了(void)stonith_signal_set_simple_handler; 不过有点奇怪: 如果是stonith_signal_set_simple_handler是static的,但是又没有函数调用它,难么这个函数有什么用呢?
LouisScola 2012-12-25
  • 打赏
  • 举报
回复
看来我们对代码编译中的warning还不够重视
LouisScola 2012-12-25
  • 打赏
  • 举报
回复
有道理,消除未使用警告
WizardOz 2012-12-25
  • 打赏
  • 举报
回复
引用 4 楼 turingo 的回复:
这种用法确实古怪,会不会是为了维持堆栈平衡。
这只是一个简单的求值语句,应该不会影响到栈的。
prajna 2012-12-24
  • 打赏
  • 举报
回复
引用
只是消除unused function警告
長見識。
ForestDB 2012-12-24
  • 打赏
  • 举报
回复
LS的有道理了。 消除“未使用的⋯⋯”警告。
FrankHB1989 2012-12-24
  • 打赏
  • 举报
回复
引用 1 楼 ForestDB 的回复:
话说还真没看出来,感觉也是个错的语句,把函数名做个(void)cast,能编译过? 印象中只有void *,或者函数的返回值为void合法,其余的void的用法都有问题。
cast to void是允许的,而且可以算是个消除某些编译器/静态代码检查工具警告的惯用法。 不过这里似乎只是消除unused function警告(要是参数则可以解释为消除unused parameter警告)。要找得到对应的汇编都很可能成问题。
PIE 2012-12-24
  • 打赏
  • 举报
回复
引用 7 楼 tianweishuiguo 的回复:
看看汇编这句干啥了
AnYidan 2012-12-24
  • 打赏
  • 举报
回复
没看出来有何意思
东大坡居士 2012-12-24
  • 打赏
  • 举报
回复
看看汇编这句干啥了
MRKG2012 2012-12-24
  • 打赏
  • 举报
回复
函数调用吧。
  • 打赏
  • 举报
回复
没啥意思。。
图灵狗 2012-12-24
  • 打赏
  • 举报
回复
这种用法确实古怪,会不会是为了维持堆栈平衡。
  • 打赏
  • 举报
回复
将自身函数强制类型转换为空
采石工 2012-12-24
  • 打赏
  • 举报
回复
我写了一下下面的代码,可以看做楼主问题的最简形式,没有错误,但确实不知有何作用,呼唤大侠解析!

int f()
{
	return 0;
}
int main()
{
	(void)f;
	return 0;
}
加载更多回复(1)
分布式计算是计算机科学中一个研究方向,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给多个计算机进行处理,zui后把这些计算结果综合起来得到zui终的结果。分布式网络存储技术是将数据分散地存储于多台独立的机器设备上。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,不但解决了传统集中式存储系统中单存储服务器的瓶颈问题,还提高了系统的可靠性、可用性和扩展性。 分布式计算与互联网的普及随着计算机的普及,个人电脑开始进入千家万户。与之伴随产生的是电脑的利用问题。越来越多的电脑处于闲置状态,即使在开机状态下CPU的潜力也远远不能被完全利用。我们可以想象,一台家用的计算机将大多数的时间花费在“等待”上面。即便是使用者实际使用他们的计算机时,处理器依然是寂静的消费,依然是不计其数的等待(等待输入,但实际上并没有做什么)。互联网的出现, 使得连接调用所有这些拥有闲置计算资源的计算机系统成为了现实。  分布式计算项目那么,一些本身非常复杂的但是却很适合于划分为大量的更小的计算片断的问题被提出来,然后由某个研究机构通过大量艰辛的工作开发出计算用服务端和客户端。服务端负责将计算问题分成许多小的计算部分,然后把这些部分分配给许多联网参与计算的计算机进行并行处理,zui后将这些计算结果综合起来得到zui终的结果。 当然,这看起来也似乎很原始、很困难,但是随着参与者和参与计算的计算机的数量的不断增加, 计算计划变得非常迅速,而且被实践证明是的确可行的。一些较大的分布式计算项目的处理能力已经可以达到甚而超过世界上速度zui快的巨型计算机。 您也可以选择参加某些项目以捐赠的 CPU内核处理时间,您将发现您所提供的 CPU 内核处理时间将出现在项目的贡献统计中。您可以和其他的参与者竞争贡献时间的排名,您也可以加入一个已经存在的计算团体或者自己组建一个计算小组。这种方法很利于调动参与者的热情。  参与计算随着民间的组队逐渐增多, 许多大型组织(例如公司、学校和各种各样的网站)也开始了组建自己的战队。同时,也形成了大量的以分布式计算技术和项目讨论为主题的社区,这些社区多数是翻译制作分布式计算项目的使用教程及发布相关技术性文章,并提供必要的技术支持。 那么谁可能加入到这些项目中来呢? 当然是任何人都可以! 如果您已经加入了某个项目,而且曾经考虑加入计算小组, 您将在中国分布式计算总站及论坛里找到您的家。任何人都能加入任何由我站的组建的分布式计算小组。希望您在中国分布式总站及论坛里发现乐趣。 参与分布式计算——一种能充分发挥您的个人电脑的利用价值的zui有意义的选择——只需要下载有关程序,然后这个程序会以zui低的优先度在计算机上运行,这对平时正常使用计算机几乎没有影响。如果你想利用计算机的空余时间做点有益的事情,还犹豫什么?马上行动起来吧,你的微不足道的付出或许就能使你在人类科学的发展史上留下不小的一笔呢。 raft算法之所以容易理解,其一是他将一致性问题划分成几个子问题,这几个子问题都是独立、可理解和解释的。从传统的思维来讲,对于一个复杂的系统或者工程,都是大化小,分解实现,然后去尝试融合解决整体逻辑。包括CS系统的设计也是如此。 一致性算法的目标 1.安全性:在非拜占庭错误情况下,包括网络延迟、分区、丢包、冗余和乱序等错误都可以保证正确。2.可用性:只要集群中大多数节点处于runing,并且不分区,和客户端能通信,那么我们需要保证这个集群可用。3.对于数据同步,小部分慢节点的不会影响系统性能。因为对于日志复制,我们如果等待所有节点响应,那么系统的性能会存在短板效应。 说白了,就是如果一个集群中,如果大多数节点可用(网络、服务),那么通过raft算法,我们就能保证整个系统可用(可处理请求,数据一致性)。后面我们主要研究的就是raft是如何做到的。首先我们要知道,Raft算法将其问题划分为 领导选举 日志复制 安全性 对于一个集群只有一个leader(领导),那么我们就很容易理解。只要领导操作同步到对应的followers(跟随者),数据必然一致。当leader宕机,需要进行领导选举。 日志复制其实就是同步操作数据的过程。leader将操作日志同步到其他节点。安全性:如何安全的同步,在不同的情况,我们都能保证一致性,这也就是安全性需要考虑的问题。 其实就是如此,raft首先假设了领导选举。然后实现了日志复制,zui后在安全问题上解决上面的漏洞问题。 

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧