Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

IMHO, звёздочки/скобки не обязательны. (+)

Отправлено ReAl 28 апреля 2007 г. 20:18
В ответ на: (+) отправлено <font color=gray>Рэйлвэй_Каген</font> 28 апреля 2007 г. 18:55

Как писал без них ещё под до-ансишный компилятор, так и сейчас пишу


6.3.2.1 Lvalues, arrays, and function designators
...
4 Afunction designator is an expression that has function type.
Except when it is the operand of the sizeof operator or the
unary & operator, a function designator with type ‘‘function
returning type’’ is converted to an expression that has type
‘‘pointer to function returning type’’.

Я это понимаю как то, что и в "обычной жизни" имя функции конвертируется в указатель на функцию, к которому приписан список аргументов в круглых скобках.


6.5.2.2 Function calls
Constraints
1 The expression that denotes the called function77) shall have type
pointer to function returning void or returning an object type
other than an array type.
2 If the expression that denotes the called function has a type that
includes a prototype, the number of arguments shall agree with the
number of parameters. Each argument shall have a type such that its
value may be assigned to an object with the unqualified version
of the type of its corresponding parameter.

Semantics
3 A postfix expression followed by parentheses () containing a
possibly empty, commaseparated list of expressions is a function
call. The postfix expression denotes the called function.
The list of expressions specifies the arguments to the function.
...
77) Most often, this is the result of converting an identifier that is a function designator.


Т.е. в разделе про "вызов функций вообще" постоянно говорится о выражениях, имеющих тип указателя на функцию.
А как вам такое вот примечание к "выражению, которое указывает на вызываемую функцию" - "наиболее часто это результат преобразовения идентификатора". Т.е., на мой взгляд (и успешный применения многих компиляторов за много лет)

a = sin(b);
a = (flag ? sin : cos )(b);

В первой строке мы имеем "наиболее частый" случай, выражение есть просто имя функции, во второй - выражение, которое "have type
pointer to function"

Может, конечно, я ошибаюсь, но как минимум один пример есть :-)
C99, EXAMPLE 2 к пункту 6.9.1


EXAMPLE 2 To pass one function to another, one might say
int f(void);
/* ... */
g(f);

Then the definition of g might read
void g(int (*funcp)(void))
{
/* ... */
(*funcp)() /* or funcp() ... */
}

or, equivalently,

void g(int func(void))
{
/* ... */
func() /* or (*func)() ... */
}


Только некоторые компиляторы "не едят" такие эквивалентности.
В частности, Кейл 6.2 для 51-ых
Uart0.EnableTransmitter()
прекрасно понимает, а вот вещи типа
a = (flag ? sin : cos )(b);
не жрёт, хочет так
a = (*(flag ? sin : cos ))(b);
что меня в своё время удивило.



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
при вычитании трёх из шести получится:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru