由于printf不是可重入的,因此在信号处理程序中使用它并不安全.但我已经看到很多使用printf这种方式的示例代码.
所以我的问题是:我们何时需要避免printf在信号处理程序中使用,是否有推荐的替代品?
我试过这个
typedef void (* __stdcall MessageHandler)(const Task*);
Run Code Online (Sandbox Code Playgroud)
这编译但给了我这个警告(VS2003):
警告C4229:使用的时间错误:忽略数据上的修饰符
我想用stdcall调用约定声明一个指向函数的指针?我究竟做错了什么?
可能重复:
函数引用
我在一本书中找到了这个代码,
typedef int (&foo)(int,int);
这是什么意思 ?这是对函数的引用吗?如果是,为什么用它?它与指向这样的函数的指针有什么不同.
typedef int (*foo)(int,int);
这只是C++中不是C的增强吗?
编辑:
#include <iostream>
#include <typeinfo>
using namespace std;
int f (int , int ) {return 0;}
int main() {
int (&foo)(int,int) = f;
int (*fp)(int,int) = f;
std::cout<<typeid(foo).name()<<std::endl<<typeid(fp).name();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我打印的类型foo和fp它给了这样的事情:
FiiiE
PFiiiE
什么是E最后的.为什么foo是F同时fp是PF?
会typedef int (&rifii) (int, int)用什么?
这个"声明"之前的typedef是什么?我想把它想象成这样
typedef (int (&rifii) (int, int)) [new name]
Run Code Online (Sandbox Code Playgroud)
但如果你这样做的话,[新名字]并不存在
typedef int INTEGER;
Run Code Online (Sandbox Code Playgroud)
类似的问题,以下语法:
typedef void (*PF) ();
PF edit_ops[ ] = { &cut, &paste, ©, &search };
PF file_ops[ ] = { &open, &append, & close, &write };
PF* button2 = edit_ops;
PF* button3 = file_ops;
button2[2]( );
Run Code Online (Sandbox Code Playgroud)
什么是typedef允许?它是否正在制作,因此您无需键入:
void (*PF) ();
(void (*PF) ()) edit_ops[ ] = { &cut, &paste, ©, &search };
(void (*PF) ()) file_ops[ ] = { &open, &append, …Run Code Online (Sandbox Code Playgroud) 据我所知,我可以定义一个函数类型:
typedef void (fn)(void);
Run Code Online (Sandbox Code Playgroud)
我还可以定义一个函数指针类型:
typedef void (*pfn)(void);
Run Code Online (Sandbox Code Playgroud)
有2个功能.第一个函数的参数类型是一个函数,另一个是函数指针:
void a(fn fn1)
{
fn1();
}
void b(pfn fn1)
{
fn1();
}
Run Code Online (Sandbox Code Playgroud)
我实现了一个函数回调:
void callback(void)
{
printf("hello\n");
}
Run Code Online (Sandbox Code Playgroud)
并将其作为参数传递给a和b:
int main(void) {
a(callback);
b(callback);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
a和b都运行良好,并打印"hello".
所以我想知道定义函数类型和函数指针类型有什么区别?或者实际上,它们是一样的?
我有一段代码,我不明白那一个typedef:
typedef void (inst_cb_t) (const char*, size_t);
Run Code Online (Sandbox Code Playgroud)
不,实际上意味着你可以使用inst_cb_t的void呢?但是第二个括号中的内容呢?
帮助我理解以下原型.最后一次(int)做什么?
void ( *signal(int sig, void (*handler)(int)) ) (int);
Run Code Online (Sandbox Code Playgroud) 有人可以逐行解释这一点(可能是逐个字符,哈哈)?
typedef int (*funcptr)(); /* generic function pointer */
typedef funcptr (*ptrfuncptr)(); /* ptr to fcn returning g.f.p. */
funcptr start(), stop();
funcptr state1(), state2(), state3();
void statemachine()
{
ptrfuncptr state = start;
while(state != stop)
state = (ptrfuncptr)(*state)();
}
funcptr start()
{
return (funcptr)state1;
}
Run Code Online (Sandbox Code Playgroud)
例如,我想知道为什么在第1行的末尾有()."只是你如何声明指向函数的指针"这样的答案会令人满意,但是当你声明一个这种类型的变量时,为什么只使用"funcptr"而没有()?
第4行和第5行.为什么你在这里有?那些不是函数,它们是函数的指针,对吧?
第9行.为什么"状态"没有()?仍然是指向函数的指针,就像第5行和第6行的指针一样.
第9行.没有()的"开始"是什么?
第12行.什么?!(我知道什么是类型转换.至少我认为我做...)
第17行.为什么"state1"需要进行类型转换?这是它已经被铸造的类型.或者是因为它缺少()?
这对我理解这些概念真的很有帮助.
PS.这是一个微控制器,我将用于我正在设计的电子虚拟负载.认为这是一个了解更多关于C的好机会.代码来自http://c-faq.com/decl/recurfuncp.html
如果没有为第3行中的typedef命名,以下代码如何工作?编译器如何将pf视为新数据类型?
#include <stdio.h>
int fun(int, int);
typedef int (*pf) (int, int);
int proc(pf, int, int);
int main(){
printf("%d\n", proc(fun, 6, 6));
return 0;
}
int fun(int a, int b){
return (a==b);
}
int proc(pf p, int a, int b){
return ((*p)(a, b));
}
Run Code Online (Sandbox Code Playgroud) 我是一名Java开发人员.
我正在尝试理解一个C/C++项目,我发现它:
*.h 档案:
typedef void (*MyCallback) (MyHandle handle, void* context, MyResult result, ... );
int MyMethod(MyHandle handle, void* context, MyCallback cb);
Run Code Online (Sandbox Code Playgroud)
*.cpp 文件:
int MyMethod(MyHandle handle, void* context, MyCallback cb){
//...
}
Run Code Online (Sandbox Code Playgroud)
而我真的没有得到它的意义......
任何人都可以向我解释这是什么意思typedef void?我只使用简单的typedef来处理简单的结构......但是在这个中我可以看到一个可怕的指针(对于Java开发人员而言,抱歉指针恐惧症......).
而且,为什么我们这样做typedef ?? 我没有MyCallBack在MyMethod功能上看到任何指针.
我需要了解这段代码的含义.
非常感谢!