首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将“有副作用的表达式”传递给getc?

如何将“有副作用的表达式”传递给getc?
EN

Stack Overflow用户
提问于 2013-12-17 08:14:19
回答 2查看 238关注 0票数 1

“UNIX环境中的高级编程,第3版”,第151页: getcfgetc的区别在于,getc可以实现为宏,而fgetc不能实现为宏。这意味着三件事:

  • getc的参数不应该是一个有副作用的表达式。
  • 由于fgetc保证是一个函数,我们可以获取它的地址。这允许我们将fgetc的地址作为参数传递给另一个函数。
  • fgetc的调用可能比调用getc花费的时间更长,因为调用函数通常需要更长的时间。

以流指针作为参数的函数签名可以发生什么“有副作用的表达式”?

代码语言:javascript
运行
复制
#include<stdio.h>
int getc(FILE* stream);
int fgetc(FILE* stream);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-17 08:19:37

传递带有副作用的表达式的方法可能有数百种,但“可信”的方法可能如下所示:

代码语言:javascript
运行
复制
FILE *files[NUM_FILES];
...
int rc = getc(files[counter++]);

如果getc作为宏实现得不好,则可以多次计算表达式files[counter++],从而导致意外行为。

票数 6
EN

Stack Overflow用户

发布于 2013-12-17 08:19:44

举个例子,不要写

代码语言:javascript
运行
复制
FILE* foo() { puts( "Bah!\n" ); return stdout; }

void advance() { getc( foo() ); }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20629059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档