整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

电子商务(四级)单选题(443)

电子商务(四级)单选题(443)

、(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_openmodule_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文件