On 13/01/2023 02:38, samuel ammonius wrote:
Hello,About a year ago, I emailed here asking if C bindings could be added to Qt's official repo, and since then I've written a pretty large python script that generates the wrappers by reading Qt's header files. I originally thought that "inline extern" function declarations would make the compiler copy the binary code of the function into the caller program, but I just found out that the compiler ignores "inline" in this case.
That's not what `inline` is for. Did you try doing a static build, and enable a sufficiently aggressive LTO?
I don't think that makes the idea of C wrappers useless, but
there's another method of binding to C that could dodge the performance issue, and maybe even make Qt run faster on C++ (or at least compile faster). It does interfere with Qt's existing codebase way more than the wrapper method though, so I understand if it wouldn't be accepted.The idea is to give Qt functions C-compatible names, and then wrap them with "inline" functions inside a class. This code outlines the idea:// qpushbutton.h struct QPushButton_struct { bool flat; } void QPushButton_setFlat(QPushButton *btn, bool flat); bool QPushButton_flat(QPushButton *btn); #ifdef __cplusplus class QPushButton : private QPushButton_struct { public: Q_ALWAYS_INLINE auto setFlat(bool flat){ QPushButton_setFlat(this, flat); } Q_ALWAYS_INLINE auto flat(){ QPushButton_flat(this); } }; #else typedef QPushButton_struct QPushButton; #endifMaking inline C++ wrappers for C is possible since C++ can read "QPushButton_setFlat", but C can't read "QPushButton::setFlat". This change isn't as drastic as it may seem at first, since all code inside the functions can still use the C++ function names without any difference in behavior or performance. The only change will be in the names of function declarations and definitions, and in how classes are formed. Qt could still be compiled if this is done to certain classes but not others, so the transition wouldn't have to be instant.
I'm not sure what you're proposing here. That all of Qt becomes C code, with a C++ wrappers forwarding everything to the C code? That's never going to fly.
Besides, what use case do you have for such an effort? If you need a GUI for a C program, and you want to use Qt, can't you isolate the "UI layer" in your code and use C++ only in that layer, keeping the rest of the code in pure C? C++ can interoperate with C out of the box.
My 2 c, -- Giuseppe D'Angelo | giuseppe.dang...@kdab.com | Senior Software Engineer KDAB (France) S.A.S., a KDAB Group company Tel. France +33 (0)4 90 84 08 53, http://www.kdab.com KDAB - The Qt, C++ and OpenGL Experts
smime.p7s
Description: S/MIME Cryptographic Signature
_______________________________________________ Development mailing list Development@qt-project.org https://lists.qt-project.org/listinfo/development