Fre*_*rey 9 c union pointers typedef function-pointers
对于我正在处理的项目,最好有一个通用的“函数指针”类型。但是,在 C 中,要拥有指向函数的指针,您需要在函数指针的类型中指定原型。
例如,如果我有 function void setdata(short data)
,我不能将它存储在与 function 相同的指针中int getdata()
,因为它们的参数和返回值是不同的。
经过一些横向思考,我想出了以下解决方法:
typedef long (* PFL)(); /* pointer to function that returns a long... */
typedef short (* PFI)(); /* pointer to function that returns a short... */
typedef void (* PFV)(); /* pointer to function that returns a void... */
typedef void (* PFVAL)(long); /* pointer to function that returns a void...
but has a long argument...*/
typedef void (* PFVAI)(short); /* pointer to function that returns a void...
but has an short argument...*/
typedef void (* PFVAU)(unsigned short);
typedef void (* PFVAII)(short, short); /* same as above, but two shorts... */
typedef void (* PFVAUU)(unsigned short, unsigned short); /* same as above, but two shorts... */
typedef union {
PFV pfv;
PFI pfi;
PFL pfl;
PFVAL pfval;
PFVAI pfvai;
PFVAU pfvau;
PFVAII pfvaii;
PFVAUU pfvauu;
} FP;
Run Code Online (Sandbox Code Playgroud)
果然,我可以像这样初始化这种类型的实例:
FP funcpointer = { .pfvai = setdata };
Run Code Online (Sandbox Code Playgroud)
Clang 和 GCC 不会抱怨。这是一个坏主意吗?
你正在做的事情是有效的。只要您通过正确的指针类型调用指向的函数,它就得到了很好的定义。
然而,这个联合可能会变得很大,具体取决于您必须支持多少种不同的函数类型,并且您必须使其与您的 typedef 集保持同步。事实证明,您可以通过强制转换自由地从一种函数指针类型转换为另一种函数指针类型,您只需确保使用正确的类型调用它即可。
C 标准的 6.3.2.3p8 节对函数指针转换进行了以下说明:
指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再转换回来;结果应等于原始指针。如果转换后的指针用于调用其类型与引用类型不兼容的函数,则行为未定义。
因此,您也可以仅用作void (*)()
通用指针类型而不是使用联合,然后在调用它时需要应用正确的强制转换。例如:
typedef void (*FP)();
FP fp = setdata;
...
((PFVAI)fp)(123);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
186 次 |
最近记录: |