C/C++

Где сработает этот код перегрузки функции: на Си или на C++, и почему?

#include<stdio.h>
void function(char* str)
{
int d=(int)str;
printf("\n function in job...\n");
printf("\n digit1=%d \n",d);
}

int main()
{
char*(*pfunction)(int digit1,int digit2, int digit3);
pfunction=function;
(*pfunction)(5,12,4);
return 0;
}
Muzaffar Kasymov
Muzaffar Kasymov
37 945
C+C=Сиси
Konstantin Gaevoy
Konstantin Gaevoy
27 683
Лучший ответ
Muzaffar Kasymov Молодец, шаришь:)
C не поддерживает перегрузку функций хотя бы из-за того что в C нет манглига сигнатур для определения входящих типов аргументов. более того у C нет и не будет ABI это полностью ассемблированный язык программирования где программист всегда должен понимать как будет выглядеть его C код на ассемблере.
Приведённый пример содержит критическую ошибку как для языка C так и для когенерации. При замещении стандартного соглашения вызова с __cdecl на __stdcall обязаность отчищать стек после аргументов берет на себя вызываемый символ. если символ сгенерирован с 1 аргументом значит со стека будет снят 1 аргумент, соотвественно при вызове функции с соглашением __stdcall которой передали 3 аргумента а не 1 произойдет разбалансировка стека после возврата управления из функции.
Более того при JIT компиляции где адрес на функцию есть номер интерфейса вызываемого объекта произойдет ошибка приведения сигнатуры в любом случаее __cdecl или __fastcall.
Что касается последнего вопроса на ответ @Artem Basov то в GCC разрешено замещять декларации символов внутри скоупа функций. но это не перегрузка а замещение, и при подстановке аргумента из первостепенного декларирования произойдет ошибка.

Евгений Высочин, Перегрузка функции != загрузке адреса функции. перегрузка это сопоставление аргументов с сигнатурой функции.

void f(int);
void f(void*);

int main()
{
f(0);
f((void*)0);
return 0;
}

### -->>asm

define dso_local i32 @main() local_unnamed_addr #0! dbg! 9 {
tail call void @_Z1fi(i32 0), !dbg! 14
tail call void @_Z1fPv(i8* null), !dbg! 15
ret i32 0, !dbg! 16
}

declare! dbg! 17 dso_local void @_Z1fi(i32) local_unnamed_addr #1

declare! dbg! 20 dso_local void @_Z1fPv(i8*) local_unnamed_addr #1

main: # @main
pushq %rax
xorl %edi, %edi
callq _Z1fi
xorl %edi, %edi
callq _Z1fPv
xorl %eax, %eax
popq %rcx
retq
ДЧ
Дэн Чик
3 177
Muzaffar Kasymov Когда читаю вроде "__cdecl на __stdcall ", вижу, что товарищЧ еще не спрыгнул с дерева, то бишь с windows.
Ну да ладно, каждый леньтяй сам виноват в отсутствии своего прогресса:)
Парниша, ты давно от компилятора оторвался? Когда в последний раз что-то серьёзное кодил?:)
Ладно, с другой стороны ещё зайду: ты в курсе, чем отличается замыкание функций в Си от замыкания в C++??
Коротко напомни сам себе суть:)
Тогда всё станет на свои места.
А кидаться пустой теорией и не проверенными словами для мужчины как-то не серьёзно. Это указывает на то, что ты ещё - сопливый пацан, серьёзного кода не нюхал и не писал ничего, кроме своих лабораторных заданий на уроках:)
В Си нельзя перегружать функции.
Александр
Александр
1 930
Muzaffar Kasymov А ты попробуй
Muzaffar Kasymov Для компилятора имя любой переменной, в том числе любой функции, - это есть её адрес.
Чтобы перегрузить функцию, мы либо берём её имя, либо присваиваем (загружаем) её адрес.
какой автор стал нервный. Сам умеет только копировать C++, а над другими глумиться. не хорошо. =)