...
Code Block |
---|
#define FOO(a, b, c) bar(a, b, c) /* ... */ FOO(arg1, arg2, arg3); |
*PRE01-EX2:* Macro parameters cannot be individually parenthesized when concatenating tokens using the {{ Wiki Markup ##
}} operator, converting macro parameters to strings using the {{#
}} operator, or concatenating adjacent string literals. The {{JOIN()
}} macro below concatenates both arguments to form a new token. The {{SHOWASHOW()
}} macro converts the single argument into a string literal, which is then concatenated with the adjacent string literal to form the format specification in the call to {{printf
()}}. The {{SHOWB()}} macro is an improved version of {{SHOWA()}} that supports invocations of the form {{SHOWB(i%j)}}. It also eliminates the possibility of a format string vulnerability (
see \[[FIO30-C. Exclude user input from format strings]])
.
Code Block |
---|
#define JOIN(a, b) (a ## b) #define SHOWASHOW(a) printf(#a " = %d\n", a) #define SHOWB(b) printf("%s = %d\n", #b, b) |
See PRE05-A. Understand macro replacement when concatenating tokens for more information on using the ##
operator to concatenate tokens.
...