Как объявить функцию, возвращающую пустоту, и переменные c с автоматически вводимыми параметрами? - PullRequest
0 голосов
/ 28 апреля 2020

Прямо сейчас у меня есть что-то вроде этого:

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

Мне нужно что-то более похожее на:

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

Но это не разрешено языком, поскольку C ++ отрицает auto в объявлениях функций.

Если я не ошибаюсь, <template> создаст совершенно новую функцию за вызов, в зависимости от аргументов, с которыми она была вызвана, исправьте меня, если я ошибаюсь.

Ограничения : я не могу никоим образом определять здесь функцию, поскольку у меня абсолютно нет контроля над функцией, без заголовка, ничего.

Если бы я мог, я бы использовал лямбду или шаблон.

Если вы думаете, что это проблема XY, которая все еще может быть, я делаю это во время компиляции C ++ в WebAssembly.


Если вы хотите знать, код фактический выглядит следующим образом:

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

#define WASM_IMPORT extern “C”

WASM_EXPORT const void log(int output);

Ключевой момент: фактические внешние функции не доступно во время компиляции.

Поскольку фактический код, который я использую, не мой, я дам pr благодарность действительному автору: https://medium.com/@dougschaefer / идет прямо-в-clang-for-webassembly-928df1484430

Их краткое руководство по WebAssembly с использованием C ++ - это то, что я использую. Их реализация сгенерированного выходного файла также там, если вам нужна дополнительная информация.

Для тех из вас, кто не знает, JavaScript функция *1045* очень похожа на C int printf(char*, ...), у него даже есть строка формата.

1 Ответ

2 голосов
/ 28 апреля 2020

Понял это

Как ни странно, я уже написал ответ на вопрос, даже не осознавая этого.

Поскольку вы ограничены типами, доступными в C, вы можете используйте простые C variardi c функциональные параметры.

Вы сравнили его с printf; Объявление printf будет выглядеть так:

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

Да, вот и все. ... сообщает компилятору, что он может принять что-либо после этой точки, и что одна функция будет обрабатывать все это.

Предупреждение : C variardi c параметры не безопасны для типов, но с JavaScript это все равно не будет иметь значения.

Спасибо @Mat за ваш комментарий, который напомнил мне, что C имеет параметры variardi c.

Кроме того, я работал с ними долгое время go, так что, думаю, я просто забыл их с тех пор.


Извините за любые неверные интерпретации, вызванные моей плохой формулировкой: extern функции переносятся из локальной среды, в данном случае это JavaScript.

Функция уже функция vararg.

Еще лучше, так как вам нужно даже если первый аргумент имеет тип переменной, вы можете напрямую использовать (...).

Update

На самом деле, extern "C" не единственный вариант, extern "C++" также опция, позволяющая использовать типы C ++, но в то же время предотвращающая искажение имен.

...