C++链接属性

  编译器将.cpp编译成.obj,而.obj就是编译单元
  一个程序,可以由一个编译单元组成,也可以由多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话,就请使用多个编译单元吧。那么就是一个.cpp对应一个.obj,然后将所有的.obj链接起来(通过一个叫链接器的程序),组成一个.exe,这就是程序了。
  如果一个.cpp要用到另一个.cpp定义的函数怎么办?
  只需在这个.cpp中写上他的函数声明就可以了,其余工作由链接器帮你完成,你可以随便调用该函数,链接器将所有的.obj连接起来,但是注意如果有相同的函数或外部变量,这会报重定义的错误,例如下面两个源文件source1.cpp和source2.cpp:

/**
  * @file   source1.cpp
  * @brief  在source1.cpp中定义一个函数func(),文件内容如下
  */
void func()
{

}
/**
  * @file   source2.cpp
  * @brief  在source2.cpp中同样定义一个函数func(),文件内容如下
  */
#include<iotream>
void func()
{

}
int main()
{

    return 0;
}

  编译运行就会报重定义的错误。
  但是庆幸的是,C++可以通过一种叫做链接属性的关键字来限定,你的这个函数是属于整个程序公用的,还是只是在一个编译单元.obj内使用的。这些关键字就是extern 和 static。 extern是外部链接的意思,也就是除了这个单元,外部的单元也是能够访问这个函数的。static 是内部链接,自属于自己单元。
  下面具体分析:

内部链接属性

  static修饰的变量或函数表明是内部链接,也就是若在其它.cpp文件定义了同样的变量或函数(即使其属性是外部链接),编译也不会报错;
  const修饰的常量也是内部链接。

外部链接属性

  extern修饰的变量或函数是外部链接;
  所有的全局变量和函数默认也是外部链接;
  extern const修饰的变量也是外部链接。注意不要弄混了,没有extern static的这样的用法,前者是外部链接,后者是内部链接。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 QML 中,可以通过 Connection 元素将 QML 与 C++ 代码连起来,实现跨语言的交互。具体步骤如下: 1. 在 C++ 中定义一个信号并在相应的槽函数中发射该信号。 ```cpp // MyClass.h class MyClass : public QObject { Q_OBJECT public: MyClass(QObject *parent = nullptr); signals: void mySignal(int value); public slots: void mySlot(); }; // MyClass.cpp MyClass::MyClass(QObject *parent) : QObject(parent) { } void MyClass::mySlot() { emit mySignal(42); } ``` 2. 在 QML 中创建一个 Connection 元素,将该元素的 target 属性设置为 C++ 中定义的对象或者对象名称,将 signal 属性设置为 C++ 中定义的信号名称,将 slot 属性设置为 QML 中定义的槽函数名称。 ```qml import QtQuick 2.0 Rectangle { width: 200 height: 200 Connections { target: myObject // C++ 中定义的对象或者对象名称 signal: mySignal(int) // C++ 中定义的信号名称 slot: mySlot // QML 中定义的槽函数名称 onMySignal: console.log("Received signal with value:", value) } } ``` 3. 在 QML 中创建相应的槽函数,用于收 C++ 中发射的信号。 ```qml import QtQuick 2.0 Rectangle { width: 200 height: 200 function mySlot(value) { console.log("Received signal with value:", value); } } ``` 4. 在 C++ 中将对象暴露给 QML 引擎,并在 QML 中访问该对象。 ```cpp // main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include "MyClass.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); MyClass myObject; QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("myObject", &myObject); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); } ``` 以上就是在 QML 中连 C++ 的基本步骤。需要注意的是,在连 C++ 时需要使用 Qt 的元对象系统(Meta-Object System),因此需要在 C++ 类中添加 Q_OBJECT 宏。同时,需要在 QML 文件中导入 C++ 类型所在的命名空间,以便可以使用该类型及其成员函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值