任何人都可以简单解释一下。
c ++中的SAL_CALL是什么?
答案 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”代表“系统抽象层”。