复杂一点的,就得按照C++的多态原理,用虚函数表(其实就是能记录函数名对应的函数地址就好)记录每种结构体的成员函数地址,然后每个结构体里多存一个虚函数表的地址。。。然后调用函数的时候查到函数地址强转成函数类型然后调用。。。这个可以自己研究一下c++的虚函数表机制。
以下是实现上述功能的 C 程序示例:
#include <stdio.h>
#include <string.h>
#define MAX_LEN 80 // 字符串最大长度
int main(int argc, char *argv[])
{
if (argc <2) {
printf("Please specify a file name.\n")
return 1
}
// 从命令行得到文件名
char *file_name = argv[1]
// 打开文件
FILE *fp = fopen(file_name, "r")
if (fp == NULL) {
printf("Failed to open file.\n")
return 1
}
// 创建字符数组
char str[MAX_LEN]
// 从文件中读入一个字符串
fgets(str, MAX_LEN, fp)
// 关闭文件
fclose(fp)
// 输出字符串和字符串长度
printf("String: %s\n", str)
printf("Length: %d\n", (int)strlen(str))
return 0
}
这段代码实现了从命令行得到文件名,然后使用 fgets 函数从文件中读入一个字符串,最后输出字符
楼主有些误解了,C语言中的确有你说的多变参数的函数,比如printf()scanf()等等,它们的实现也的确是用宏来实现了,具体实现不赘述,C++是C的超集,自然也可以用这种方式解决。下面说多态,其实多态是面向对象的特征,具体到C++中,函数的重载,重写,以及虚函数都是多态的体现,而类似于C中的多变函数,则是用函数的重载实现的,举个例子
class A
{
public:
void func(int)
void func(float)
void func(long)
}
void A::func(int x)
{
cout <<"int version" <<endl
}
void A::func(float x)
{
cout <<"float version" <<endl
}
void A::func(long x)
{
cout<<"long version" <<endl
}
void main()
{
int a
float b
long c
func(c)
func(b)
func(a)
}
类A中的func()成员函数有3个重载版本,重载函数是通过对应不同的参数来识别时调用哪一个函数,这就是类似C中的可变函数。
(重载只是C++中多态的一角,想更详细的了解的,我想市面上任何一本C++
的书都会讲到,不过重点可能都是虚函数,重载和重写比较容易理解)
----------------我是无视上面的分割线--------------------------
你的问题里面不是说C++么
C语言怎么实现的看我转的这篇文章吧