Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I concatenate two macros with a dot between them without inserting spaces?

I'm preprocessing my InfoPlist file to include my revision number. My header looks like this:

#import "svn.h"

#define APP_VERSION 1.0
#define APP_BUILD APP_VERSION.SVN_REVISION

When I check my build version from within the program, it's 1.0 . 123456. But if I try this:

#import "svn.h"

#define APP_VERSION 1.0
#define APP_BUILD APP_VERSION ## . ## SVN_REVISION

I get

error: pasting formed 'APP_VERSION.', an invalid preprocessing token
error: pasting formed '.SVN_REVISION', an invalid preprocessing token

I've seen this question but it doesn't actually give an answer; the OP didn't actually need to concatenate the tokens. I do. How do I concatenate two macros with a dot between them without inserting spaces?

like image 762
Simon Avatar asked Sep 14 '25 10:09

Simon


1 Answers

The problem looks like it is being caused by a quirk of the preprocessor: arguments to the concatenation operator aren't expanded first (or... whatever, the rules are complicated), so currently the preprocessor isn't trying to concatenate 1.0 and ., it's actually trying to paste the word APP_VERSION into the output token. Words don't have dots in them in C so this is not a single valid token, hence the error.

You can usually force the issue by going through a couple of layers of wrapper macros so that the concatenation operation is hidden behind at least two substitutions, like this:

#define APP_VERSION 1.0
#define SVN_REVISION 123456

#define M_CONC(A, B) M_CONC_(A, B)
#define M_CONC_(A, B) A##B

#define APP_BUILD M_CONC(APP_VERSION, M_CONC(.,SVN_REVISION))

APP_BUILD    // Expands to the single token 1.0.123456

You're in luck in that a C Preprocessor number is allowed to have as many dots as you like, even though a C float constant may only have the one.

like image 181
Leushenko Avatar answered Sep 17 '25 20:09

Leushenko



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!