Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Function Prototype - Turning off argument checking

From K&R Book on C, I gathered that if the function prototype declaration omits the arguments (as in int foo();) the type and argument checking is turned off and nothing is assumed about the arguments to be compatible with older versions of C and so it doesn't break legacy code.

But the following code throws a compilation error that the prototypes mismatch:

#include <stdio.h>
void test();
int main(void) {
    test(34.5f);
}

void test(float a) {
    printf("%f\n", a);
}

Error:

C:\***.c:7:6: error: conflicting types for 'test'
 void test(float a) {
      ^

Any explanations?

like image 816
BalaK Avatar asked Feb 04 '17 00:02

BalaK


People also ask

Is it necessary to declare function prototype?

It is not required, but it is bad practice not to use prototypes. With prototypes, the compiler can verify you are calling the function correctly (using the right number and type of parameters).

What is the difference between function header function prototype and arguments?

The only difference between the function prototype and the function header is a semicolon (see diagram below). The function definition is placed AFTER the end of the int main(void) function. The function definition consists of the function header and its body.

What is not included in function prototype?

In computer programming, a function prototype or function interface is a declaration of a function that specifies the function's name and type signature (arity, data types of parameters, and return type), but omits the function body.

Is function prototype the same as function declaration?

A function declaration is any form of line declaring a function and ending with ; . A prototype is a function declaration where all types of the parameters are specified.

What is a function prototype?

A function prototype is a declaration in the code that instructs the compiler about the data type of the function, arguments and parameter list. As we all know that a block of code which performs a specific task is called as a function.

How do you check for errors in a function prototype?

You can detect errors of this kind by declaring complete function prototypes for all functions. A prototype establishes the attributes of a function so that calls to the function that precede its definition (or occur in other source files) can be checked for argument-type and return-type mismatches.

How to turn off function argument tooltips in Microsoft Excel?

How to turn off function argument ToolTips in Microsoft Excel 2002 and in Microsoft Excel 2003 To do this, follow these steps: On the Toolsmenu, click Options. In the Optionsdialog box, click the Generaltab. Click to clear the Function tooltipscheck box, and then click OK.

What happens if there is no function prototype in C++?

In the absence of the function prototype, a coder might call function improperly without the compiler detecting errors that may lead to fatal execution-time errors that are difficult to detect. return_type function_name ( type argument1, type argument2, ...);


3 Answers

When a function is declared more than once, all declarations must have compatible type (C11 6.2.7/2). In your code f is declared twice - the definition also counts as a declaration.

The definition of "compatible function type" is in C11 6.7.6.3/15:

For two function types to be compatible, both shall specify compatible return types. Moreover, the parameter type lists, if both are present, shall agree in the number of parameters and in use of the ellipsis terminator; corresponding parameters shall have compatible types. If one type has a parameter type list and the other type is specified by a function declarator that is not part of a function definition and that contains an empty identifier list, the parameter list shall not have an ellipsis terminator and the type of each parameter shall be compatible with the type that results from the application of the default argument promotions. If one type has a parameter type list and the other type is specified by a function definition that contains a (possibly empty) identifier list, both shall agree in the number of parameters, and the type of each prototype parameter shall be compatible with the type that results from the application of the default argument promotions to the type of the corresponding identifier. (In the determination of type compatibility and of a composite type, each parameter declared with function or array type is taken as having the adjusted type and each parameter declared with qualified type is taken as having the unqualified version of its declared type.)

Therefore void test() and void test(float) are incompatible. In other words, after seeing void test();, any prototype must only use types that are unchanged by the default argument promotions. float changes to double under those promotions.

I believe this has always been the case since the first C Standard.

like image 77
M.M Avatar answered Oct 20 '22 19:10

M.M


Define the function with the parameter of the type double.

void test(double a) {
    //...
}

The problem is in this call

test(34.5f);

there is used the default argument promotion that converts the argument to the type double.

like image 21
Vlad from Moscow Avatar answered Oct 20 '22 17:10

Vlad from Moscow


According to the error message, an argument type that has a default promotion can’t match an empty parameter name list declaration. So the problem is that float would be promoted to int, which would then cause a mismatch with the function definition's float parameter.

Declaration:

void test();

It's tells the compiler that there exists a function test which no parameters and not returns a value.

Definition:

void test(float a)

It's tells the compiler what test() actually is and also provides the declaration as well.

like image 1
msc Avatar answered Oct 20 '22 19:10

msc