如何知道是否正在使用QT项目
How to know whether a calling convention is in use with a Qt project?
您知道,当您定义函数时,您可以同时定义其调用约定,因此可以:
int __stdcall foo(int) { return 1; };
int __cdecl bar(int) { return 1; };
,如果要使用此功能推断模板参数,则必须处理调用惯例,例如:
template<typename T> void tmpl_func( T( __stdcall f )(T) ) { other_func<T>(); };
使用此模板,您只能将" foo "用作参数。如果您使用" bar ",则无法编译。
tmpl_func(foo); // ok
tmpl_func(bar); // err
因此,如果您具有使用 __ cdecl 的函数,则必须使用两个调用约定来定义模板函数,例如:
template<typename T> void tmpl_func( T( __stdcall f )(T) ) { other_func<T>(); };
template<typename T> void tmpl_func( T( __cdecl f )(T) ) { other_func<T>(); };
和 foo 实例化 __ stdcall 版本, bar bar __ cdecl 版本,没有redefinition。>
通常,这很好,但是最近我遇到了一个问题:
在QT项目中,当我以上面说的方式定义模板函数时,编译器说: __ cdecl 模板函数已经定义了。
并且,如果您仅定义 tmpl_func in __ stdcall 版本,它也可以使用 bar 作为参数。
这是否意味着我编写的所有调用惯例标识符都不起作用,并且所有功能都在 __ cdecl 中调用?
为什么以及我怎么知道这种情况是否会发生?我可以使用宏或编译选项检查它吗?
对不起,我的英语不好,我希望我已经清楚了,但这确实使我困扰了一段时间。
您知道,当您定义函数时,您可以同时定义其呼叫约定
这是错误的。您所描述的是(特定于供应商的)扩展到C 。例如,在Linux上的GCC编译器上,它可能无法正常工作。
在QT项目中,
在您的QT代码中完全不使用任何 emplicit __stdcall
或 __cdecl
注释。
(在您的QT代码中使用该 在您的脚上射击:痛苦;坚持QT5项目的标准C 11代码) 如果您需要调用某些外部怪异的函数(带有奇怪的&amp; em> explicit 调用约定)写一些 务实地,在编码QT项目时,您会使用所有警告&amp;对其进行编译。调试信息(因此 (隐含地询问extern "C"
(或一些 static inline
,如果它很短,则这样做的包装功能(并且您的包装功能具有通常的签名,而无需明确的呼叫惯例注释)。g++ -Wall -g
如果使用GCC),则使用gdb
调试器进行调试,然后您以后优化(例如使用g++ -Wall -g -O2
编译)IT -E.G。为了进行基准测试和生产代码 - 您相信编译器可以很好地优化,并在内联函数调用中进行内联呼叫,并选择足够好的呼叫约定。不要弄乱QT代码中的召集约定。__stdcall
或__cdecl
是如何更改C 的类型系统,并且C 类型已经足够复杂了,您不希望更多的混乱)
- 错误-我无法在VS2019中打开新的Qt项目
- 将QT项目导入Visual Studio 2019会给我带来很多LNK2001错误
- 尝试在 QT 项目中调用 Java 代码时未找到类异常
- 无法在默认Qt项目中打开源文件"ui_QtGuiApplication.h"
- 在路径的独立Qt项目中包括外部库
- 为Qt项目树中的所有项目定义全局宏
- CMake用于C++/Qt项目中的外部库
- 如何将ICU库添加到ARM的Qt项目中
- 将libtensorflow_cc.so文件链接到QT项目
- 将网络添加到Qt项目
- 编译Qt项目,得到错误QQmlEngine:没有这样的文件或目录编译终止
- 是否可以在QT项目中使用Tensorflow C++ API?
- 在Qt C++项目中使用Go
- 编译Qt项目给出了对运算符delete(void*,unsigned int)的未定义引用
- 为Qt项目的每个模块添加一个包含
- 如何使用.UI文件在QT Creator中使用CMAKE制作GUI QT项目
- 在Qt项目中包括谷歌测试
- Qt项目与自定义共享库交叉编译Qt
- 如何从Qt C++项目运行Python函数
- 如何使用 qmake 将 pcl 库成功添加到 qt 项目中