、(C 基于Internet (企业内部网)的网络电)
态性翻译成中文是多型(态)
这是一个对象指向语言中的基本概念,就是变量(class、struct)在运行时去改变行为而不是编译时决定。
C 语言言很难做到这一点,用函数指针抽换可以勉强做到,但这样的努力容易使人进步,换来的好办法又有限,最大的缺口是超级难用。客户端必须知道今天要抽甚么函数指针,光这一点就已经过离物件导向的封装概念了。
今天要介绍一种能够完全封装且实用多种的机制,不多说,先来看看客户端的代码
int main(int argc, char **argv)
{
struct dl_module *module=NULL;
int value=0;
printf("get %s's price: ", argv[1]);
module=module_open(argv[1]);
value=(*module->get_price)();
printf("%d\n", value);
module_close(module);
return 0;
}
struct dl_module这是我的多模接口,与多种对象导向一样,这是多模的必要条件,当用户从shell脚本中输入不同的参数,程序必须动态的吐出价格。
这边只有定义为一个类型,并且能够做到运行时改变值的能力,这就是多功能的典型特征。
因为C语言没有构造式和解构式,所以客户端只好傻傻的调用module_open,module_close并且,自动化的构造式和解构式容我有机会再介绍吧。
接下来看看神奇的模块相关API
struct dl_module
{
void *handle;
int (*get_price)(void);
};
struct dl_module *module_open(char *name)
{
char path[100];
void *handle=NULL;
struct dl_module *module=malloc(sizeof(struct dl_module));
sprintf(path, "lib%s.so", name);
handle=dlopen(path, RTLD_NOW);
module->get_price=(int (*)(void))dlsym(handle, "get_price");
module->handle=handle;
return module;
}
void module_close(struct dl_module *module)
{
dlclose(module->handle);
free(module);
}
透过dlopen和dlsym,这就允许程序在运行时以动态方式载入共享库或动态库,而外部的shell只需要把.so准备好即可。
gcc poly_test.c -ldl
gcc -fPIC cola.c -shared -o libcola.so
LD_LIBRARY_PATH=./ ./a.out cola获取可乐的价格:29
例子中的cola可以换成各种东西,例如sunflower或banana,只是记得要实践libsunflower.so。
至於cola.c里面其實現就只有一個函數:get_price,而且很單純的return 29(反正量簡單比较好懂)
这种做法就将不同的实施方案封装在共享库中,而客户端可以透过string去抽换功能,甚至更糟的是,连函数名都用string去抽换也行。
这些示例代码都没做error handle,要抄的人记得自己加(不然很容易SIGSEGV)
这种作法是把编译时可以抓到的bug推遲到运行时去,如果你写下来get_price形成get_prince,这个支程就掰了。
配套就是写一个parser去建立symbol的综合表并且去检查所有的module_open是不是符合综合表的内部内容,然后之后在Makefile内部调用这个parser做preprocess,如此即可完整其美,又有好的程序结构又能兼顾编译时bug。
转自:https://wirelessr.gitbooks.io/working-life/content/polymorphism_in_c.html
使用QJSEngine引擎编译和运行JavaScript脚本时,你可以将JavaScript代码保存在一个独立的文件中,并使用QFile读取该文件内容,然后使用QJSEngine的evaluate()方法执行该代码。下面是一个示例,演示如何加载并执行一个独立的JavaScript文件:
#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <QJSEngine>
#include <QJSValue>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 读取JavaScript文件内容
QFile file("script.js");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Failed to open script file!";
return -1;
}
QString script=file.readAll();
file.close();
QJSEngine engine;
// 执行JavaScript脚本
QJSValue result=engine.evaluate(script);
// 检查结果并输出
if (result.isNumber()) {
int sum=result.toInt();
qDebug() << "Sum: " << sum;
} else {
qDebug() << "Error evaluating script!";
}
return a.exec();
}
在上面的示例中,我们首先使用QFile打开并读取名为"script.js"的JavaScript文件的内容。然后,我们创建了一个QJSEngine对象,并使用evaluate()方法执行从文件中读取的JavaScript代码。最后,我们检查结果的类型并输出。
确保将实际的JavaScript文件命名为"script.js"并与可执行文件位于同一目录下。你可以在JavaScript文件中编写复杂的功能,包括定义函数、使用对象等。
这是一个简单的示例,演示了如何使用QJSEngine引擎加载和执行一个独立的JavaScript文件
*请认真填写需求信息,我们会在24小时内与您取得联系。