299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
1

Что такое имя функции?

27.07.2019, 16:04. Показов 16284. Ответов 45
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
скажите пожалуйста что такое имя функции?


создаю указатель на функцию

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
void foo(void){
 
std::cout << "hi all! ";
}
 
 
int main(){
 
(*p)(void)=foo;   // вот если я присваиваю указателю на функцию  foo без &  , то есть 
 
(*p)(void)=&foo; // то значит имя функции  " foo" это или адрес или указатель.
 
 
return 0;
}
что такое имя функции?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2019, 16:04
Ответы с готовыми решениями:

При вводе имени сообщить, что есть такое имя
Хочу написать программу, при вводе имени(например Katy), должно вывестись что есть такое имя. Что...

Что такое Функции в C++
Можете объяснить что такое функции в C++, только подробно. Я не понимаю как они работают и да...

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое виртуальные функции?
Всем привет! Ребята, что такое виртуальная функция? Как пользоваться ими и для чего они нужны?...

45
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
27.07.2019, 23:31 41
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Eanmos Посмотреть сообщение
ты нашел ответ на свой вопрос?
Он посмотрел на нас и подумал, - "Да ну нафиг этих старых маразматиков".
1
698 / 140 / 57
Регистрация: 20.08.2017
Сообщений: 255
27.07.2019, 23:32 42
Кстати, интересно заметить, что благодаря такому неявному преобразованию возможно делать вот такое:

C
1
2
void (*p)(void) = foo;
(******************p)();
0
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
28.07.2019, 00:07  [ТС] 43
Цитата Сообщение от Eanmos Посмотреть сообщение
pcmax, ты нашел ответ на свой вопрос?

нет.

под именем функции я в данном случае понимаю вот это
C++
1
 foo
именно его присвою указателю на функцию
C++
1
(*p)(void)=foo;  // foo тут что?  адрес , указатель?
говорят тут что foo преобразовывается в указатель функции при вызове ее. но я тут ничего не вызываю. я присваиваю указателю на фукцию адрес функции. потому что укзатель для этого и служит. так если я присваиваю его без знака аперсанта, то foo что тогда?

Добавлено через 50 секунд
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 .file   "div.c"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $10, -4(%rbp)
    movl    $5, -8(%rbp)
    movl    -4(%rbp), %eax
    movl    %eax, %edx
    sarl    $31, %edx
    idivl   -8(%rbp)
    movl    %eax, -12(%rbp)
    movl    $0, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:

что тут значит .LFB0 ?

может так пойму
0
698 / 140 / 57
Регистрация: 20.08.2017
Сообщений: 255
28.07.2019, 00:49 44
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Цитата Сообщение от pcmax Посмотреть сообщение
C++
1
(*p)(void)=foo; *// foo тут что? *адрес , указатель?
Следи за рукой. foo — это function designator expression. При использовании почти в любых контекстах function designator expression преобразуется в non-lvalue указатель на эту функцию. В данном случае это неявное преобразование имеет место быть. Так что можешь считать, что «имя функции» — это function designator expression (но также и идентификатор).

Вот это:

C
1
p = foo; /* foo - function designator expression, неявно преобразуется в указатель на функцию */
и

C
1
p = &foo; /* foo - function designator expression, &foo - указатель на функцию */
эквивалентные записи. Только в первом случае преобразование в указатель неявное, а во втором — явное.

Добавлено через 4 минуты
Цитата Сообщение от pcmax Посмотреть сообщение
что тут значит .LFB0 ?
Это метка в языке ассемблера.

Добавлено через 16 минут
Вообще, как мне кажется, тебя интересует совсем другой вопрос: «Что вообще такое функция?».

Смотри, допустим, у нас есть массив swap:

C
1
const char swap[] = "\x8b\x44\x24\x04\x8b\x5c\x24\x08\x8b\x00\x8b\x1b\x31\xc3\x31\xd8\x31\xc3\x8b\x4c\x24\x04\x89\x01\x8b\x4c\x24\x08\x89\x19\xc3";
Его содержимое — это некоторый машинный код x86, который меняет местами значения двух своих параметров (не рассматриваем calling conventions). Конечно, этот код не соответствует стандарту и далеко не везде будет работать (подробнее — здесь). Но…

Мы можем использовать этот массив как функцию!

C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
const char swap[] = "\x8b\x44\x24\x04\x8b\x5c\x24\x08\x8b\x00\x8b\x1b\x31\xc3\x31\xd8\x31\xc3\x8b\x4c\x24\x04\x89\x01\x8b\x4c\x24\x08\x89\x19\xc3";
 
int main(void)
{
    int a = 10, b = 20;
 
    ((void(*) (int *, int *)) swap)(&a, &b);
 
    printf("%d %d\n", a, b); // 20, 10
}
Компилятор разместит массив temp в сегменте кода (возможно) и передаст управление на начало этого сегмента. Т. е. грубо говоря, функция — это просто набор инструкций с инструкцией ret в конце (_Noreturn не рассматриваем). В конце выполнения функции (этого набора инструкций) управление передастся обратно в вызывающий код. Таким образом, указатель на функцию — это просто адрес первой инструкции этой функции (в ассемблерном коде такие адреса как раз и обозначаются метками).

Тоже самое мы могли бы написать как:

C
1
((void(*)(int *, int *))"\x8b\x44\x24\x04\x8b\x5c\x24\x08\x8b\x00\x8b\x1b\x31\xc3\x31\xd8\x31\xc3\x8b\x4c\x24\x04\x89\x01\x8b\x4c\x24\x08\x89\x19\xc3")(&a, &b);
Этот код непортабелен, и вообще он просто, чтобы продемонстрировать идею. Никогда так не пиши.
2
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
28.07.2019, 03:03  [ТС] 45
вроде понял... спасибо
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
28.07.2019, 22:08 46
Цитата Сообщение от Croessmah Посмотреть сообщение
Если я правильно понимаю, то postfix-expression в выражении вызова может быть непосредственно типом функции
The postfix expression shall have function type or function pointer type.
О том, что function-to-pointer conversion не применяется буквально написано в следующем за процитированным предложении...

Цитата Сообщение от Evg Посмотреть сообщение
У decltype аргументом может быть либо entity, либо expression.
https://timsong-cpp.github.io/... -specifier
2
28.07.2019, 22:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2019, 22:08
Помогаю со студенческими работами здесь

Что такое обертка функции?
дана функция на входе получает 2 параметра имя и возраст. srting children(string ima, int age)...

Что такое ссылки на функции?
Хай. Вопрос в заголовке. Можно, пожалуйста с примером. Спасибо.

Что такое прототип функции?
Зачем нужен прототип функции ведь она и без него прекрасно работает? Если можете объясните как...

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
46
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru