In my project I have turned on treat warnings as errors and compiling using the -pedantic
and -ansi
tags. I am using GCC compiler. In this project I have to use a third party source code which has got lot of warnings. Since I treat warnings as errors, I am having a tough time in fixing their code.
Most of the warnings are about invalid conversion from int
to size_t
or viceversa. In some cases, I won't be able to make both the variables same type, I mean I won't be able to change something to size_t
. In such cases I am doing an explicit cast. Something like,
size_t a = (size_t) atoi(val);
I am wondering is this the correct approach? Is there any problem in doing cast like this?
If these warnings are minor, can I suppress it only on their files? How do I do the same on MSVC?
I personally consider this kind of warning idiotic and would turn it off, but the fact that you're asking about it suggests that you might be sufficiently unfamiliar with conversions between integer types and the differences in signed and unsigned behavior that the warning could be useful to you.
Back on the other hand again, I really despise [explicit] casts. The suggestion to use
strtoul
instead ofatoi
is probably a very good one. I see you commented thatatoi
was only an example, but the same principle applies in general: use functions that return the type you want rather than forcing a different type into the type you want. If the function is one you wrote yourself rather than a library function, this may just mean fixing your functions to returnsize_t
for sizes rather thanint
.Have a look at the OpenOffice wiki on the best practices for error-free code: http://wiki.services.openoffice.org/wiki/Writing_warning-free_code
They suggest static casts for these conversions, and then supply a pragma to disable warnings for a particular section of code.
Edit:
Casting is the only approach if you want to shut up the compiler per instance in a portable way. It is fine as long as you know what you're doing, e.g. that you can ensure the result of
atoi
will never be negative.In GCC, you can turn off all sign conversion warnings with the
-Wno-sign-conversion
flag. There is also-Wno-sign-compare
(for stuff like2u > 1
) but it won't be relevant unless you use-Wextra
.You could also use the diagnostic pragmas like
In MSVC, there are several warnings relevant to signed/unsigned mismatch, e.g.:
2u > 1
)size_t
→int
)To disable a warning in MSVC, you could add a
#pragma warning
e.g.or add a
/wd4267
flag in the compiler options.Perhaps you should use
strtoul
instead ofatoi
.(There is no warning only if
size_t
is as large asunsigned long
. On most platforms, this is true, but it is not guaranteed.)The advantage is you could perform error checking with this function, e.g.