What is function prototype in C programming
In C programming, a function prototype is a declaration of a function that specifies the function's name, return type, and the number and types of its parameters. It provides a way for the compiler to verify that calls to the function are made correctly, and to check that the function is defined correctly.

A function prototype typically appears at the beginning of a program, before the main function or any other functions that call the function being prototyped. It has the following general form:

return_type function_name (parameter_list);

Where:

- return_type: specifies the data type of the value returned by the function.
- function_name: specifies the name of the function.
- parameter_list: specifies the type and name of each parameter passed to the function, separated by commas.

Here is an example of a function prototype for a simple function that calculates the square of a number:
```
int square(int);
``` 
This prototype declares a function named square that takes an integer parameter and returns an integer value. Once the prototype is declared, the function can be defined later in the program, after all other function prototypes and before the function is called.
Ok great, can you tell me about functions that don't return a data type
In C programming, a function that does not return a data type is called a void function. A void function is a function that performs a task but does not return a value. When declaring a void function, the function prototype takes the form:

void function_name(parameter_list);

Where:

function_name: specifies the name of the function.
parameter_list: specifies the type and name of each parameter passed to the function, separated by commas.

Here is an example of a void function prototype for a function that prints a message to the console:

void print_message(char*);

This prototype declares a function named print_message that takes a character pointer as a parameter and does not return a value.

Void functions are often used for tasks such as printing to the console, updating global variables, or modifying data structures. In these cases, the function's purpose is to modify state rather than to return a value.
Can a function have multiple prototypes?