c - 为什么在使用 ncurses 时不能有一个成员名为 "refresh"的结构?

标签 c pointers struct ncurses

我正在制作一个 ncurses 应用程序,我遇到了一些令人费解的事情。

如果您有一个结构,其中有一个名为“refresh”的成员,它是一个函数指针,并且您稍后调用该函数,您将得到以下编译时错误:

main.c:20:10: error: ‘Point’ has no member named ‘wrefresh’
     point.refresh();

这里有一个你可以尝试编译的小测试:

#include <ncurses.h>

typedef struct PointStruct Point;

void Point_refresh() {

}

struct PointStruct {
    int x;
    int y;
    void (*refresh)();
};

int main() {
    Point point;
    point.x = 0;
    point.y = 0;
    point.refresh = &Point_refresh;
    point.refresh();
}

这会给你上面提到的错误。但是,如果您删除包含 ncurses 的第一行,它将编译没有问题。

这对 ncurses 不起作用的原因是什么,有没有办法解决它?这没什么大不了的,只是有点烦人,我必须重命名该成员。

最佳答案

因为 refresh() 是一个“伪函数” #define 被 curses 定义为 wrefresh(win) 的宏,所以预处理器将替换源中所有出现的那个词。除了 #undef 之外,没有其他明智的方法,始终使用 wrefresh() 代替。

关于c - 为什么在使用 ncurses 时不能有一个成员名为 "refresh"的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23530837/

相关文章:

c - 不同链表结构的函数addnode

C 数组赋值使用大括号语法

c - 字符串分配给指针字符串数组和动态内存的问题

c:带有strut和array的字符串输入

c++ - 如何将此 C 代码转换为 C++?

c - 程序不打印空格和标点符号

C - 获取打开的处理程序列表 - 重复条目

json - 为什么 json.Unmarshal 在 golang 中追加一个新指针后会更改指针值?

c++ - C++ 中 struct typedef struct 的用途

c - _int64 位域