加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么这是合法的,c typedef功能

发布时间:2020-12-16 10:49:51 所属栏目:百科 来源:网络整理
导读:我是在msvc 2005中做到的. typedef void (*cleanup_t)();void func(cleanup_t clean){ cleanup_t();} 为什么编译?而不是给我一个警告?好吧,它给了我一个未引用的形式参数警告但最初我做了这个当干净在一个类没有没有未引用的形式参数时,这个代码给我的问题
我是在msvc 2005中做到的.

typedef void (*cleanup_t)();

void func(cleanup_t clean)
{
    cleanup_t();
}

为什么编译?而不是给我一个警告?好吧,它给了我一个未引用的形式参数警告但最初我做了这个当干净在一个类没有没有未引用的形式参数时,这个代码给我的问题.

什么是cleanup_t();真的在做什么,重点是什么?现在笑了,我尝试了int(),这也有效.

解决方法

它正在为cleanup_t类型执行一个默认初始化程序,以创建该类型的临时文件,然后从不实际使用该临时文件.

它很像构造函数调用,“MyClass c = MyClass();”的“MyClass()”部分,除了指针到函数类型实际上没有构造函数.当然在我的代码片段中,“MyClass()”不一定会创建一个临时的,因为它是一个初始化表达式. “MyClass().some_method();”中的“MyClass()”也许是一个更接近的类比.

“int()”是另一种说“int(0)”的方式,这是另一种说“(int)0”的方式,这是另一种说“0”的方式.同样,它分配给一个临时的,如果是整个语句,那么临时是未使用的.

如果您在GCC上使用-Wall编译问题中的代码,则会收到警告“语句无效”.执行此操作的人的代码可能意味着键入“clean();”,不会产生该警告,因为它当然会产生调用该函数的效果.切换警告的另一个原因,并正确地修复它们;-)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读