type fun() != type fun(void)

Erre nemrég hívták fel a figyelmemet. Gondoltam megosztom; nem tudom mennyire ismert. C-ben ha a definícióban függvényeknél üresen hagyjuk a zárójelet, az nem azt jelenti, hogy nem vesz argumentumokat a függvény, hanem bármilyet vehet. Példa:

#include <stdio.h>

int
add2(int a, int b)
{
	return a+b;
}

int
add3(int a, int b, int c)
{
	return a+b+c;
}

typedef int (*intfp)();

int
main(int argc, char **argv)
{
	int i;
	intfp p[2];
	
	p[0] = &add2;
	p[1] = &add3;
	for(i = 0; i < 2; i++){
		printf("%d\n", (*p[i])(2, 3, 5));
	}
	return 0;
}

Hozzászólások

Error	1	error C2440: '=' : cannot convert from 'int (__cdecl *)(int,int)' to 'intfp'	test.cpp	23
Error	2	error C2440: '=' : cannot convert from 'int (__cdecl *)(int,int,int)' to 'intfp'	test.cpp	24
Error	3	error C2197: 'int (__cdecl *)(void)' : too many arguments for call	test.cpp	26

Es ez meg cLang alatt is igy van. Durva.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Én is majdnem beírtam, de látom, hogy megelőztél.
Minden esetre akkor jól emlékeztem, hogy a *printf nem így működik, hanem a '...'+stdarg (va_start+va_arg+va_end) függvénycsoporttal.
-------------------------------------------------------------------------------
Az életben csak egy dolog a szép, de az épp nem jut eszembe.

Slackware Linux 13.37 | 2.6.39.3-janos

köszönöm, láttam már eleget :)
De ezek nem varázsszavak, amik hatására valami csoda történik.
A rádió sem attól működik, hogy bekapcsolod és tekergeted, hanem attól, hogy tranzisztorok vannak benne, meg rezgőkör, meg stb.

--------------------------------------
Unix isn't dead. It just smells funny.

sub.
-------------------------------------------------------------------------------
Az életben csak egy dolog a szép, de az épp nem jut eszembe.

Slackware Linux 13.37 | 2.6.39.3-janos

Jelzem, hogy az

add2

meghívása három paraméterrel undefined behavior.

ISO C99 6.5.2.2p6

If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type float are promoted to double. These are called the default argument promotions. If the number of arguments does not equal the number of parameters, the behavior is undefined. [...]

A

(*p[i])

típusához nem tartozik prototípus (a paraméterek típusa nincs deklarálva az

intfp

-nél). Az argumentumok száma 3, a paraméterek száma 2.

akinek ez ujdonsag, az szerintem inkabb ne programozzon c-ben.
kiveve, ha epp a mult heten kezdte el tanulni...

Hiányosak az ismereteim, mint mindenkié, ahogy a tiéd is. Viszont én nem veszem le senkiről a keresztvizet emiatt még általánosságban se.
Sajnos ennek a szakmának a sajátja egy olyan bitvájár réteg, akit bármikor levehetsz a polcról mint egy "language reference"-t, viszont programozni nem tud. Én igen... azzal több pénzt tudok lapátolni mintha wikipediát játszanék.