4

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?

Community
  • 1
  • 1
Simon
  • 25,468
  • 44
  • 152
  • 266

1 Answers1

7

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.

Alex Celeste
  • 12,824
  • 10
  • 46
  • 89
  • it showing error as invalid suffix '.123456' on floating constant – Abhishek Feb 25 '16 at 11:51
  • @Abhishek are you compiling as well or just preprocessing? The main C language can't handle multi-dot numbers, so you need to make sure they end up in a string or otherwise hidden from it. – Alex Celeste Feb 25 '16 at 13:24