c - 用作指针的函数名
问题描述
我有这个功能:
void *task();
并且名称 task 用作另一个函数中的参数:
pthread_create(..., task, ...);
这是一个特例,还是函数的名称包含其地址这一事实总是正确的?
pthread_create 的上述参数应该是一个指针:
void *(*start_routine)(void*)
编辑:
void *task()
{
printf("I am a simple thread.\n");
}
感谢您的时间。
解决方案
没有特殊情况 - 相反!函数名几乎总是衰减为指向函数的指针。唯一的例外是当它是 的操作数时&
,即&task
它不会衰减为函数指针,但无论如何&
都会task
将函数指示符转换为指针,因此如果指定一个函数(即它不是指针),两者pthread_create(..., task, ...);
和pthread_create(..., &task, ...);
会一样工作。
事实上,函数调用运算符只能应用于函数指针:
printf("Hello world");
获取函数指示符printf
并将其转换为指向函数的指针,然后调用 this 指针指向的函数并为其提供参数"Hello world"
。
另请注意,void *task();
pthread 函数的声明有些不正确,它应该是void *task(void *);
.
推荐阅读
- html - 创建带有字体真棒图标的响应式卡片
- database - 使用 Flyway 迁移创建用户
- excel - 通过宏插入表单控制按钮时出现VBA Excel“预期函数或变量”错误
- php - php中的求和数组
- xml - 当我将 XML 文档加载到 Monaco 编辑器时,如何通过鼠标单击或选择获取 XML 信息?
- linux - hpw 设置 -rw-rw-r-- 对 linux 服务器上的文件的此权限
- c++ - 为什么它只“看到”第一行?
- unity3d - Azure Pipeline 从文件夹生成 .sln/.csproj 作为管道过程的一部分
- google-sheets - 如何根据另一列中的日期使一列返回所需的值?
- javascript - Firestore REST API WHERE IN 查询