I have a few questions about the default argument promotions when calling a function in C. Here\'s section 6.5.2.2 \"Function calls\" Paragraphs 6, 7, and 8
(Non variadic) parameters to functions with a prototype are converted to the corresponding type, which can be char, short, float.
Parameters to functions without prototype and variadic parameters are subject to default argument promotions.
If you define a function with a prototype and use it without the prototype or vise versa and it has parameters of type char, short or float, you'll probably have a problem at run-time. You'll have the same kind of problems with variadic functions if the promoted type doesn't match what is used when reading the argument list.
Example 1: problem when defining a function with a prototype and using it without.
definition.c
void f(char c)
{
printf("%c", c);
}
use.c
void f();
int main()
{
f('x');
}
can fail because an int will be passed and the function expect a char.
Example 2: problem when defining a function without a prototype and using it with one.
definition.c
void f(c)
char c;
{
printf("%c", c);
}
(This is kind of definition is very old fashioned)
use.c
void f(char c);
int main()
{
f('x');
}
can fail because an int is expected but a char will be passed.
Note: you'll remark that all functions from the standard library have types which result from default promotions. So they didn't cause problem during the transition when prototypes were added.