宏方法有2个返回? 我刚刚从java移到C++,以前从来没有使用过宏,我很困惑有些方法是如何返回两个变量的,比如 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)

宏方法有2个返回? 我刚刚从java移到C++,以前从来没有使用过宏,我很困惑有些方法是如何返回两个变量的,比如 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM),c++,macros,c-preprocessor,C++,Macros,C Preprocessor,或者更奇怪的组合,比如 JNIEXPORT jdoubleArray JNICALL Java_algorithms_Shuffle0_getPriorities (JNIEnv *, jobject, jint, jint). 有人能告诉我发生了什么事吗?抱歉,如果这看起来是极度无知,但我说我以前从来没有使用过宏,预处理器上的C++章节的完整引用并不能使这些安排更清楚。 < p>你需要扩展每个宏来完全理解它。在预处理器中运行代码以查看其如何扩展,或者使用有用的IDE工具向您展示 当您这样做时

或者更奇怪的组合,比如

JNIEXPORT jdoubleArray JNICALL Java_algorithms_Shuffle0_getPriorities (JNIEnv *, jobject, jint, jint).

有人能告诉我发生了什么事吗?抱歉,如果这看起来是极度无知,但我说我以前从来没有使用过宏,预处理器上的C++章节的完整引用并不能使这些安排更清楚。

< p>你需要扩展每个宏来完全理解它。在预处理器中运行代码以查看其如何扩展,或者使用有用的IDE工具向您展示

当您这样做时,您将看到以下内容:

  • LRESULT
    是结果类型。这是一个可以描述的整数
  • 回调
    定义调用约定,即
    \uu stdcall
至于另一个:

  • JNIEXPORT
    可能扩展到
    declspec(dllexport)
    。这指定要从库中导出函数
  • jdoubleArray
    是返回值
  • JNICALL
    将是调用约定

您可以将这些额外的标记视为函数的装饰器。它们不会在概念级别更改函数的签名。在Java中最类似的概念可能是属性。

宏实际上不会“返回”任何东西。它们只是文本替换。所以
#定义FOO 42
bar(FOO)
变成
bar(42)
。谢谢,这是我错过的调用约定部分。现在有道理了。