LINUX.ORG.RU

По традиции - первый вариант. Для совместимости с плюсами - второй.

sergv
()
Ответ на: комментарий от sergv

Я не нашел там упоминания об указателях на функции.

Но зато нашел в 6.5.3.2 (стр. 78) пункт 1:

The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.

Я понял так:

f() - вызов функции
f - function designator
&f - pointer to the function

Просто компилятор, видя присвоение указателю function designator'a сам кастует его в pointer.

Я прав?

bk_ ★★
() автор топика
Ответ на: комментарий от sergv

Я прав?

В дополнение: я прав :)

6.3.2.1 пункт 4:

... a function designator with type ‘‘function returning type’’ is converted to an expression that has type ‘‘pointer to function returning type’’.

Вот где прописано поведение компилятора в этом случае: он сам преобразует function designator в pointer to function.

bk_ ★★
() автор топика
Ответ на: комментарий от rimsleur

правильнее и логичнее

Согласен, но я искал *четкое* *конкретное* определение поведения компилятора в этом случае. Нашел, смотри выше.

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

Круче выходит: 6.3.2.1 пункт 4

A function designator is an expression that has function type. Except when it is the operand of the sizeof operator 54) 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’’.
sergv
()
Ответ на: комментарий от sergv

Кстати а стандарта на русском нет?
Тяжело читать подобный текст по-английски, а любопытно было бы ознакомиться с документом «от корки и до корки».

Stahl ★★☆
()
Ответ на: комментарий от Stahl

Кстати а стандарта на русском нет?

Я не нашел.

Лежит ссылка на всякий пожарный для сложных случаев.

sergv
()

Хм. Не знал, что второй вариант работает. Это же нечто, вроде

char *str = "строчка текста";
char *str2 = &str;

Eddy_Em ☆☆☆☆☆
()

первый способ, ИМХО, более логичный.

Имя массива - указатель на первый элемент, имя функции - указатель на первую процессорную инструкцию функции

Harald ★★★★★
()
Ответ на: комментарий от bk_

Вот я и говорю, что всегда думал, что &some_func — указатель на указатель. А оказывается, gcc такие «косяки» разруливает…

P.S. Таки указатель на функцию так объявляют:

type (*fptr)(args)

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от bk_

> Поведай мне тайну

по стандарту®©™ void* — строго указатель на данные. указатель на функцию (код) и указатель на данные не совместимы. т.е. стандартом®©™ не предусмотрен кастинг указателя на функцию к void*, как и наоборот. see also: [man dlsym], [http://stackoverflow.com/a/12358887].

arsi ★★★★★
()
Ответ на: комментарий от arsi

по стандарту®©™ void* — строго указатель на данные

стандартом®©™ не предусмотрен кастинг указателя на функцию к void*

Буду очень признателен, если дашь ссылку на соотв. пункт стандарта.

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

> Буду очень признателен, если дашь ссылку на соотв. пункт стандарта.

ISO/IEC 9899:1999, 6.3.2.3, пункт 8.

а чем тебе не подошли два других пруфлинка? (выдержка из любимого *ксоидами мана и цитаты обоснования данного решения комитета стандартизации си.)

arsi ★★★★★
()
Ответ на: комментарий от Eddy_Em

всегда думал, что &some_func — указатель на указатель

Enjoy your C :)

buddhist ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.