2015-01-08 3 views
2

На MSVC и ССАГПЗ (GCC) 4.8.3 20140911 следующие компилируется и работает просто отлично:C - функция типы указателей с именованными параметрами

#include <stdio.h> 

int func(int a, int b){ 
    return 0; 
} 

int main(void){ 
    int (*funcPointer)(int a, int b); 

    funcPointer = func; 

    printf("funcPointer = %p\n", funcPointer); 

    return 0; 
} 

Является ли такое поведение хорошо определен, или он нестандартен, и на самом деле запрещено использовать типы указателей функций с именованными параметрами (т.е. именами, а также типами в списке параметров)?

+1

Говоря о ** msvc ** и ** gcc ** (всего две реализации) Что вы имеете в виду с нестандартным? Насколько я считаю,% p не является стандартным форматом для печати указателей (не уверен, что c99 и позади) Также не знаю, чего вы хотите добиться, чтобы напечатать указатель функции вообще. –

+1

@ LuisColorado: нет причин действительно, только для демонстрационных целей =) – Mints97

+0

Да, но в этом случае не стоит говорить о стандартном поведении, так как есть варианты поведения как реализации. Большинство реализаций используют точку входа вызова функции в качестве указателя на нее, поэтому нет никакой разницы в значении, хранящемся в переменной после проверки типа (во время компиляции) –

ответ

4

У вас может быть параметр в указателе на функцию. Это абсолютно справедливо. Список параметров соответствует имени вызываемой функции, и имена просто необязательны.

Он также может быть записана в виде

int (*funcPointer)(int,int); 

Я имею в виду

int (*funcPointer)(int a, int b); 

Это справедливо, и вы можете проверить то же самое, позвонив

int res = funcPointer(3,4); 

и возвращение

int func(int a, int b){ 
    return a+b; 
} 
1

Это совершенно законно. Имена a и b в funcPointer не используются ни для чего, но разрешены. Вы можете использовать любые (юридические) имена, которые вы хотите, они вообще не имеют значения.

0

Вопрос в ответе:

Почему это компилируется и что это значит?

int func(int a) { return a; } 

int main(int argc, char **argv) 
{ 
    int(*a)(int x(float)) = func; 

    printf("%d\n", a(1)); 

    return 0; 
} 
+1

Это недопустимый код. Вы объявляете 'a' как указатель на функцию с другим интерфейсом, чем тот, который вы используете для инициализации. Вы получаете предупреждение в C (ошибка в C++), поскольку указатели несовместимы. Вы передаете 'int' вместо указателя на функцию, которая получает' float' и возвращает 'int', но компилятор будет вызывать его без проверки, потому что вы вызываете переменную функцию. Вероятно, оно напечатает '1', но поведение должно считаться неопределенным по определению языка. –

Смежные вопросы