什么是c ++中的SAL_CALL?

时间:2011-02-24 06:27:15

标签: c++ c linux

任何人都可以简单解释一下。

c ++中的SAL_CALL是什么?

2 个答案:

答案 0 :(得分:6)

这是OpenOffice.org中使用的#define。它在sal/inc/sal/types.h中定义为以下之一:

#define SAL_CALL
#define SAL_CALL __cdecl

取决于正在编译的平台。只有在定义了_MSC_VER(对于Microsoft)时,它才会被设置为后者。

在指定以下函数时使用:

virtual void SAL_CALL acquire() throw () { ++m_nRefCount; }

将变为:

virtual void acquire() throw () { ++m_nRefCount; }

对于常规编译器和:

virtual void __cdecl acquire() throw () { ++m_nRefCount; }

for Microsoft。

关于__cdecl对Microsoft编译器的意义,请参阅here,摘录如下:


Microsoft特定

这是C和C ++程序的默认调用约定。由于调用者清理了堆栈,因此它可以执行vararg个功能。 __cdecl调用约定创建的可执行文件大于__stdcall,因为它要求每个函数调用都包含堆栈清理代码。以下列表显示了此调用约定的实现。


+------------------------+----------------------------+
| Element                | Implementation             |
+------------------------+----------------------------+
| Argument-passing order | Right to left              |
+------------------------+----------------------------+
| Stack-maintenance      | Calling function pops the  |
|   responsibility       |   arguments from the stack |
+------------------------+----------------------------+
| Name-decoration        | Underscore character (_)   |
|   convention           |   is prefixed to names     |
+------------------------+----------------------------+
| Case-translation       | No case translation        |
|   convention           |   performed                |
+------------------------+----------------------------+

答案 1 :(得分:0)

这对C ++来说并不特别。它是某种特定于项目的预处理器宏。我猜这是一种特殊的召唤惯例。我找到了one preprocessor macro in the Linux kernel,它似乎是某种64位优化的调用约定。根据该文件顶部的评论,“SAL”代表“系统抽象层”。