如何声明 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++ 类型,同时仍然防止名称混淆。
现在我有这样的东西:
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++ 类型,同时仍然防止名称混淆。