如何声明void返回函数和可变的自动类型参数



现在我有这样的东西:

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

我需要更像的东西

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

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

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

限制:我可能不会以任何方式在这里定义函数,因为我对函数完全没有控制权,没有标题,什么都没有。

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

如果你认为这是一个XY问题,它可能仍然是,我在将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-direct-to-classing-for-webassembly928df1484430

他们关于使用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。

函数已经为vararg函数。

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

更新

实际上,extern "C"并不是您唯一的选项,extern "C++"也是一个选项,它允许C++类型,同时仍然可以防止名称篡改。

最新更新