ISO C99 is widespread enough now that it is ok to use its features in programs. There is one exception: do not ever use the “trigraph” misfeature introduced by C89 and not removed until C23.
Not all features of recent Standard C are fully supported on all platforms. If you aim to support compilation by compilers other than GCC, you should generally not require newer Standard C features in your programs, or else use them conditionally on whether the compiler supports them. The same goes for GNU C extensions such as variable length arrays.
If your program is only meant to compile with GCC, then you can use these features if GCC supports them. Don’t use features that GCC does not support, except conditionally as a way to use equivalent features to those that are used when compiling with GCC.
Before C89, functions needed to be written in the K&R style, like this:
int
foo (x, y)
int x, y;
...
with a separate declaration to specify the argument prototype:
int foo (int, int);
Until the 2020s, that was the way to get the most portability to different compilers. But not any more.
Nowadays, it is rare to find a C compiler which fails to support the prototype style of function definition. It is more common to run into a compiler that has dropped support for the old K&R style. Thus, to maximize portability, write function definitions in the Standard C style.
You generally need a declaration for the function in addition to its definition, usually in a header file, to get the benefit of prototypes in all the files where the function is called.