如何知道是否正在使用QT项目

How to know whether a calling convention is in use with a Qt project?

本文关键字:QT 项目 何知道 是否      更新时间:2023-10-16

您知道,当您定义函数时,您可以同时定义其调用约定,因此可以:

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 调用约定)写一些 extern "C"(或一些 static inline,如果它很短,则这样做的包装功能(并且您的包装功能具有通常的签名,而无需明确的呼叫惯例注释)。

务实地,在编码QT项目时,您会使用所有警告&amp;对其进行编译。调试信息(因此g++ -Wall -g如果使用GCC),则使用gdb调试器进行调试,然后您以后优化(例如使用g++ -Wall -g -O2编译)IT -E.G。为了进行基准测试和生产代码 - 您相信编译器可以很好地优化,并在内联函数调用中进行内联呼叫,并选择足够好的呼叫约定。不要弄乱QT代码中的召集约定。

(隐含地询问__stdcall__cdecl是如何更改C 的类型系统,并且C 类型已经足够复杂了,您不希望更多的混乱)

>