I may be in the wrong place but if this needs to be moved...
I want to write a macro with a variable number of arguments (4-?) something like
MACRO_TEST(VAR,count,4,HEX,test,8,CHAR) etc. This would cause something like count=0x0000 test="Eureka!" to be printed in a logging file I am building. The variable name, length and type of printing to be done could be repeated as many times as necessary.
I have done a few searches on the web and found that __VA_ARGS__ appears to allow you to create a macro with a variable number of arguments as a string ("count,4,HEX,test,8,CHAR"). This is an ISO C99 Standard that Pelles C appears to support with the caution that "(for stuff listed as "supported" it sometimes just mean "accept the new syntax" without doing much else)".
I tried compiling the following macro:
270 #define SQLLIB_TEST(dumpRecd,...) \
271 fprintf(stdout,"%s\n",dumpRecd); \
272 fprintf(stdout,"test\n"); \
273 fprintf(stdout,"%s",__VA_ARGS__);
and all I get from the compile is the message "C:\My_C_Library\Include\mysqllib_client.h(270): error #1049: Syntax error in macro parameters."
Is the use of the __VA_ARGS__ macro "exploited" in Pelles C (I.E Full support for variable macros)?
If so where could I find a working example with __VA_ARGS__?
If not, any thoughts on how I could accomplish my goal via some other method (variable argument functions???) are greatly appreciated....
THANKS!
Yes, it is supported (only a few cases can accept a keyword without doing anything, so assume it is supported...)
This is the simplest of samples:
#include <stdio.h>
#define LogFile(...) (void)fprintf(stderr, __VA_ARGS__)
int main(void)
{
LogFile("Test\n");
LogFile("Line = %d, index = %d\n", __LINE__, -1);
return 0;
}
I can't tell from your post how the macro is used, so impossible to say why it's not working in your case...
Quote from: CCoder on January 11, 2008, 12:30:09 AM
I want to write a macro with a variable number of arguments (4-?) something like
MACRO_TEST(VAR,count,4,HEX,test,8,CHAR) etc. This would cause something like count=0x0000 test="Eureka!" to be printed in a logging file I am building. The variable name, length and type of printing to be done could be repeated as many times as necessary.
While people competing in the IOCCC (http://www.ioccc.org/) have made C preprocessors do amazing things, the normal usage of variable args macros doesn't have the muscle to handle this problem. You can do it as a function because you can program the function to detect the end of the arg list in a manner you specify then wrap it in a macro if you want to. I have rearranged your parameters to place a zero at the end which code yet to be written could detect.
MACRO_TEST(4,count,HEX,8,test,CHAR,0);
Unfortunately your macro does little more than printf() already does. Perhaps printf() could fill the bill.
QuoteI have done a few searches on the web and found that __VA_ARGS__ appears to allow you to create a macro with a variable number of arguments as a string ("count,4,HEX,test,8,CHAR").
It is not created as a string. It is the list of arguments in compilable form. You can make __VA_ARGS__ a string with the # macro stringize operator as shown in the Pelles-C help. Search the Index for "C Preprocessor" then click on #define.
Sorry to bump this old post, but I got the same error message as OP. In my case, the problem was due to including a common header file (where the macro using __VA_ARGS__ is defined) in the resource file (.rc). After lots of unsuccessful tries, I realized the message was being printed out by the resource compiler (porc), not pocc. The solution to this is to prevent that macro from being processed by porc.
You can use porc/rc predefined macro RC_INVOKED in header file to prevent that include file where __VA_ARGS__ is used.
#ifndef RC_INVOKED
#include <foo.h>
#endif //RC_INVOKED