gcc.info: Protoize Caveats
Go forward to Non-bugs
Go backward to C++ Misunderstandings
Go up to Trouble
Go to the top op gcc
Caveats of using `protoize'
The conversion programs `protoize' and `unprotoize' can sometimes
change a source file in a way that won't work unless you rearrange it.
* `protoize' can insert references to a type name or type tag before
the definition, or in a file where they are not defined.
If this happens, compiler error messages should show you where the
new references are, so fixing the file by hand is straightforward.
* There are some C constructs which `protoize' cannot figure out.
For example, it can't determine argument types for declaring a
pointer-to-function variable; this you must do by hand. `protoize'
inserts a comment containing `???' each time it finds such a
variable; so you can find all such variables by searching for this
string. ANSI C does not require declaring the argument types of
pointer-to-function types.
* Using `unprotoize' can easily introduce bugs. If the program
relied on prototypes to bring about conversion of arguments, these
conversions will not take place in the program without prototypes.
One case in which you can be sure `unprotoize' is safe is when you
are removing prototypes that were made with `protoize'; if the
program worked before without any prototypes, it will work again
without them.
You can find all the places where this problem might occur by
compiling the program with the `-Wconversion' option. It prints a
warning whenever an argument is converted.
* Both conversion programs can be confused if there are macro calls
in and around the text to be converted. In other words, the
standard syntax for a declaration or definition must not result
from expanding a macro. This problem is inherent in the design of
C and cannot be fixed. If only a few functions have confusing
macro calls, you can easily convert them manually.
* `protoize' cannot get the argument types for a function whose
definition was not actually compiled due to preprocessing
conditionals. When this happens, `protoize' changes nothing in
regard to such a function. `protoize' tries to detect such
instances and warn about them.
You can generally work around this problem by using `protoize' step
by step, each time specifying a different set of `-D' options for
compilation, until all of the functions have been converted.
There is no automatic way to verify that you have got them all,
however.
* Confusion may result if there is an occasion to convert a function
declaration or definition in a region of source code where there
is more than one formal parameter list present. Thus, attempts to
convert code containing multiple (conditionally compiled) versions
of a single function header (in the same vicinity) may not produce
the desired (or expected) results.
If you plan on converting source files which contain such code, it
is recommended that you first make sure that each conditionally
compiled region of source code which contains an alternative
function header also contains at least one additional follower
token (past the final right parenthesis of the function header).
This should circumvent the problem.
* `unprotoize' can become confused when trying to convert a function
definition or declaration which contains a declaration for a
pointer-to-function formal argument which has the same name as the
function being defined or declared. We recommand you avoid such
choices of formal parameter names.
* You might also want to correct some of the indentation by hand and
break long lines. (The conversion programs don't write lines
longer than eighty characters in any case.)
Created Wed Sep 1 16:42:21 2004 on bee with info_to_html version 0.9.6.