Default argument promotions in C function calls

前端 未结 3 518
小蘑菇
小蘑菇 2020-11-22 05:15

Setup

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

3条回答
  •  忘了有多久
    2020-11-22 06:19

    • (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.

提交回复
热议问题