Во что превращается C++::bool при экспорте из DLL с использованием extern "C"?

Рассмотрим следующий код:

extern "C"
{
    bool func()
    {
        // ...
    }
}

Скажите, пожалуйста, что именно будет возвращать func при экспорте из DLL? Насколько я знаю, в C нет типа bool. Так же мне известно, что в C и C++ все аргументы, типы которых меньше int, преобразуются к int (в большинстве операций).

Верно ли я понимаю, что использовать экспортированную из DLL функцию func я смогу через следующую сигнатуру:

int (*)()

Ответы (1 шт):

Автор решения: user7860670

Конструкция extern "C" задает только С linkage, то бишь делает возможность прилинковать этот модуль к модулю, написанному на С. Это выражается в том, что имя функции будет недекорированное, то бишь что в таблице экспорта будет записана функция с именем func безо всяких крякозябр. Однако сигнатура метода при этом никак не меняется. Так что extern "C" не означает что такую функцию можно будет вызвать из С кода.

Соответственно в данном случае bool ни во что не превращается. В C действительно нет типа bool. В диалекте С99 есть _Bool, однако это отдельный тип, никак не связанный с bool. И они оба никак не связаны с int. Так что сигнатура int (*)() к ней не подходит, а использовать эту функцию из С не выйдет. Если хотите использовать функцию из С, то надо

  1. возвращать int

  2. объявить функцию как noexcept или вручную перехватывать возможные исключения чтобы не допустить пересечения языковой границы при раскрутке стека.

Так же мне известно, что в C и C++ все аргументы, типы которых меньше int, преобразуются к int.

Совсем не обязательно. Такие варварские преобразования могут иметь место при вызове встроенных арифметических операторов, которые не определены для мелких типов.

→ Ссылка