FILE*不是左值吗?

pou*_*ler 4 c++

在这种情况下,我试图破译我的第一个大型程序,即LISP解释器.我对理解别人的代码的世界完全陌生,而且它似乎远比编码自己复杂得多.

我几乎无法生成当前难度的最小版本,因为我目前的难度在于最小化现有代码以便更好地掌握它,并且我在每次修改时都会遇到错误.

解释器使用Current_Input和Current_Output全局变量来抽象读取和写入文件和小部件.我只是想让它写入stdout.

相关的路线是:

Current_Output = alloc_objet(sizeof(Widget *));
objet_type(Current_Output) = OWIDGET;
Owidget(Current_Output) = Wtext;
Run Code Online (Sandbox Code Playgroud)

分配一个对象(超级类型),告诉它真正的类型是"WIDGET",并为其分配Widget Wtext.

OFILE类型已经存在,并且有一个类似于Owidget宏的宏Ofile,这里有两个:

#define Owidget(objet) (* ((output_widget) objet + JMP))
#define Ofile(objet) ((FILE *) objet + JMP)
Run Code Online (Sandbox Code Playgroud)

我想更换三条相关的线路:

Current_Output = alloc_objet(sizeof(FILE *));
objet_type(Current_Output) = OFILE;
Ofile(Current_Output) = stdout;
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误:

error: lvalue required as left operand of assignment Ofile(Current_Output) = stdout;
Run Code Online (Sandbox Code Playgroud)

这一行:

printf("%d", Ofile(Current_Output));
Run Code Online (Sandbox Code Playgroud)

产生此警告:

warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘FILE* {aka _IO_FILE*}’ [-Wformat=]
Run Code Online (Sandbox Code Playgroud)

让我相信我在烦扰线的左侧有一个文件*,我想要分配标准输出,另一个文件*.

这有什么不对?谢谢!

Sca*_*nth 12

FILE* 是一种类型,它没有右值/左值.

你传递的((FILE *) objet + JMP)是一个临时的,是一个右值.

  • 好答案.简单地说: - "你试图分配计算的结果 - 你不能这样做." (2认同)
  • @pouzzler:你不能解除引用`FILE*'(或者即使你不能在特定的实现上你也不应该),它是一个不透明的类型.库实现可能知道它实际指向的是什么,但是你没有.就此而言,你不能/不应该为`FILE*`添加一个偏移量. (2认同)