Re: Trying to understand how function overloading interacts with
va_list
Dan Katz wrote:
void fun1(const char* extra, const char* format, va_list ap) {
char outString[100];
vsprintf(outString, format, ap);
cout << extra << outString << endl;
}
void fun1(const char* format, ...) {
va_list ap;
va_start(ap, format);
fun1("Extra: ", format, ap);
va_end(ap);
}
Don't do that for anything else than testing. The two overloads have
different semantics.
1) It appears that g++ considers the va_list type to be a (non-const)
char*. Is this normal? Is it standards compliant? (I didn't see
anything in the standard that would require it, but I am not a
language lawyer...)
As far as I know the standard says exactly nothing about the type of
va_list. But char* is common.
2) It seems that the compiler is treating string literals differently
from variables which have been defined to be of type "const char*" --
i.e. in the two invocations of fun1 with the format2 string. In
particular, it seems to be doing an implicit conversion from string
constant to char*, but not from declared "const char*" to char*. But
I was under the impression that a string literal is in fact a "const
char*". Is there something in the standard that allows them to be
treated differently in this context?
It is a C compatibility issue. Many older C code does not provide const
correctness. In C it was allowed to apply modifications to string
literals unless they are explicitly declared const.
3) Assuming that g++ is being standards compliant, is can anyone suggest
a better (portable, standards compliant) way to ensure that
fun1(format2, "arg1", "arg2")
ends up calling the
void fun1(const char* format, ...)
version of fun1?
Do not overload a function which takes a variable number of arguments
with a function that does not differ in the non-variable part of the
argument list. Simply don't do that.
Marcel