如何声明 void-returning 函数和可变 auto-typed 参数?

How to declare a void-returning function and variadic auto-typed parameters?

现在我有这样的东西:

extern ... {
   void foo(int i);
};

我需要更多类似的东西:

extern ... {
   void foo(auto ...bar);
};

但是语言不允许这样做,因为 C++ 在函数声明中拒绝 auto

如果我没记错的话,<template> 会在每次调用时创建一个全新的函数,具体取决于调用时使用的参数,如果我错了请纠正我。

限制:我不能以任何方式在这里定义函数,因为我绝对无法控制函数, 没有 header, 没有。

如果可以的话,我会使用 lambda 或模板。

如果你认为这是一个 X Y 问题,它可能仍然是,我在将 C++ 编译为 WebAssembly 时正在这样做。


如果您想知道,实际 代码如下所示:

#define WASM_EXPORT __attribute__((visibility("default"))) \
    extern "C"

#define WASM_IMPORT extern “C”

WASM_EXPORT const void log(int output);

关键点:实际的外部函数在编译时可用。

由于我使用的实际代码不是我的,我会适当地注明实际作者:https://medium.com/@dougschaefer/going-straight-to-clang-for-webassembly-928df1484430

我正在使用他们关于使用 C++ 的 WebAssembly 的简短教程。如果您需要更多信息,它们对生成的输出文件的实现也在那里。

不知道的朋友,JavaScript的log()函数和C的int printf(char*, ...)很相似,甚至还有格式字符串。

想通了

有趣的是,我已经在问题中写下了答案,而不自知。

由于您受限于 C 中可用的类型,您可以使用简单的 C 可变函数参数。

您将其与 printf 进行了比较; printf 的声明如下所示:

extern "C" int printf(const char* const, ...);

是的,就是这样。 ... 告诉编译器它可以接受超过该点的任何内容,并且单个函数将处理所有内容。

警告:C 的可变参数不是类型安全的,但对于 JavaScript 无论如何都不重要。

感谢@Mat 的评论,这让我想起了 C 具有可变参数。

此外,我很久以前就和他们一起工作过,所以我想我只是从那以后就忘记了他们。


对于因我的措辞不当造成的任何误解,我们深表歉意: extern 函数是从本地环境移植的,在本例中是 JavaScript.

该函数已经一个可变参数函数。

更好的是,因为您甚至需要第一个参数是变量类型,所以您可以直接使用 (...).

更新

实际上,extern "C" 不是您唯一的选择,extern "C++" 也是一个选项,允许 C++ 类型,同时仍然防止名称混淆。