#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;
}
C/C++
Где сработает этот код перегрузки функции: на Си или на C++, и почему?
C+C=Сиси
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
Приведённый пример содержит критическую ошибку как для языка 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
Muzaffar Kasymov
Когда читаю вроде "__cdecl на __stdcall ", вижу, что товарищЧ еще не спрыгнул с дерева, то бишь с windows.
Ну да ладно, каждый леньтяй сам виноват в отсутствии своего прогресса:)
Парниша, ты давно от компилятора оторвался? Когда в последний раз что-то серьёзное кодил?:)
Ладно, с другой стороны ещё зайду: ты в курсе, чем отличается замыкание функций в Си от замыкания в C++??
Коротко напомни сам себе суть:)
Тогда всё станет на свои места.
А кидаться пустой теорией и не проверенными словами для мужчины как-то не серьёзно. Это указывает на то, что ты ещё - сопливый пацан, серьёзного кода не нюхал и не писал ничего, кроме своих лабораторных заданий на уроках:)
Ну да ладно, каждый леньтяй сам виноват в отсутствии своего прогресса:)
Парниша, ты давно от компилятора оторвался? Когда в последний раз что-то серьёзное кодил?:)
Ладно, с другой стороны ещё зайду: ты в курсе, чем отличается замыкание функций в Си от замыкания в C++??
Коротко напомни сам себе суть:)
Тогда всё станет на свои места.
А кидаться пустой теорией и не проверенными словами для мужчины как-то не серьёзно. Это указывает на то, что ты ещё - сопливый пацан, серьёзного кода не нюхал и не писал ничего, кроме своих лабораторных заданий на уроках:)
В Си нельзя перегружать функции.
Muzaffar Kasymov
А ты попробуй
Muzaffar Kasymov
Для компилятора имя любой переменной, в том числе любой функции, - это есть её адрес.
Чтобы перегрузить функцию, мы либо берём её имя, либо присваиваем (загружаем) её адрес.
Чтобы перегрузить функцию, мы либо берём её имя, либо присваиваем (загружаем) её адрес.
какой автор стал нервный. Сам умеет только копировать C++, а над другими глумиться. не хорошо. =)
Похожие вопросы
- Задание 4 по Теме Функции. Перегрузка Функций. Рекурсия. На языке программирования C++
- В каком языке, в Си или в C++, будет работать определённая функция внутри функции?
- Не понимаю как в параметрах функции учесть, например, только положительные числа, когда флоат и т. д. Тема перегрузка функций
- Написать код. Использовать функции
- Код работает некорректно. Язык Си. Нахождение максимального отрицательного элемента матрицы и замена его числом.
- Необходимо вычислить аппроксимацию данных квадратичной функцией f(x)=at2+bt+c.Вычислить коэффициенты a,b и c
- Помогите перевести код с С++ на Си
- Добавить функцию в код [C++]
- Как в функции распечатать двумерный динамический массив в Си
- День добрый \[-_-]/ вопрос по вузовскому программированию на си(C)