(Этот ответ относится к C ++ 14; на данный момент это C ++ 03).
Разрешено использовать перегрузку.Если существует определение функции extern "C"
для определенного имени, применяются следующие условия (ссылки на C ++ 14 в скобках):
- Объявление функции
extern "C"
должно быть видно по адресусмысл любого объявления или определения перегрузок этого имени функции (7.5 / 5) - Не должно быть никакого другого определения
extern "C"
функции или переменной с тем же именем, где бы то ни было.(7.5 / 6) - Перегруженная функция с тем же именем не должна объявляться в глобальной области видимости.(7.5 / 6)
- В том же пространстве имен, что и у функции
extern "C"
, не должно быть другого объявления функции с тем же именем и списком параметров.(7.5 / 5)
Если какое-либо нарушение вышеуказанных правил происходит в одном и том же модуле перевода, компилятор должен его диагностировать;в противном случае это неопределенное поведение без диагностической необходимости.
Таким образом, ваш заголовочный файл может выглядеть примерно так:
namespace foo
{
extern "C" void bar();
void bar(int);
void bar(std::string);
}
В последнем пуле говорится, что вы не можете перегружать только при связывании;это неправильно:
namespace foo
{
extern "C" void bar();
void bar(); // error
}
Однако вы можете сделать это в разных пространствах имен:
extern "C" void bar();
namespace foo
{
void bar();
}
, и в этом случае обычные правила неквалифицированного поиска определяют, будет ли вызов bar()
вкакой-то код находит ::bar
, foo::bar
или неоднозначный .