我正在学习 C 和 C++。 我用 C++ 编写了一个程序,并且正在用 C 编写相同的程序。我想使用 C 中的结构来模仿我用 C++ 编写的类。 为此,我编写了测试代码:(1) 创建一个指向函数指针的
typedef
,(2) 一个以 typedef
作为成员的结构体,以及 (3) 将成员分配给兼容的函数。
#include <stdio.h>
// comment 1 -- see next line
typedef int (*type_def_func_ptr) (int, int);
int result(int x, int y){
int temp_result = x + y;
return temp_result;
}
struct TEST_STRUCT {
int day;
int month;
int year;
type_def_func_ptr tdfp;
};
int main(){
struct TEST_STRUCT MyStruct;
MyStruct.day = 28;
MyStruct.month = 9;
MyStruct.year = 2024;
// comment 2 -- see next line
MyStruct.tdfp = result;
int result1 = MyStruct.tdfp(28, 9);
printf("Result1 is %d\n", result1);
}
代码有效。 然而,我不明白为什么代码在没有 (1)
result()
为 *result()
(注释 1)或 (2) 没有 MyStruct.tdfp = result being = &result
(注释 2)的情况下工作。 该代码仍然可以在 (2) 为 &result
或 *result
的情况下工作,这让我相信编译器正在解释我写的内容,而不是盲目编译我写的内容。
由于您使用的是
result
而没有 parantheses()
,它会自动将 reference
传递给 struct
而不是值,您的代码将同样正常工作。您不需要添加额外的 pointer(*)
int result1 = MyStruct.tdfp(28, 9);
和 int result1 = (*MyStruct.tdfp)(28, 9);
做同样的事情。
MyStruct.tdfp = result;
和 MyStruct.tdfp = &result;
也做同样的事情。
这些方便的“快捷方式”在 C++ 中也可用。如果函数是成员函数,则只需
&
即可获取函数的地址。