zubergu
zubergu

Reputation: 3716

Preprocessor error when defining =

I was trying some awkward preprocessing and came up with something like this:

#include <stdio.h>

#define SIX =6

int main(void)
{
  int x=6;
  int y=2;

  if(x=SIX)
    printf("X == 6\n");
  if(y=SIX)
    printf("Y==6\n");

  return 0;
}

gcc gives me the errors:

test.c: In function ‘main’:
test.c:10:8: error: expected expression before ‘=’ token
test.c:12:8: error: expected expression before ‘=’ token

Why is that?

Upvotes: 13

Views: 707

Answers (4)

Hrishi
Hrishi

Reputation: 7138

if(x=SIX) 

is parsed as

if (x= =6).

So you get the error.

Upvotes: 4

The == is a single token, it cannot be split in half. You should run gcc -E on your code

From GCC manual pages:

-E Stop after the preprocessing stage; do not run the compiler proper. The output is in the form of preprocessed source code, which is sent to the standard output.

Input files that don't require preprocessing are ignored.

For your code gcc -E gives the following output

  if(x= =6)
    printf("X == 6\n");

  if(y= =6)
    printf("Y==6\n");

The second = is what causes the error message expected expression before ‘=’ token

Upvotes: 15

Balau
Balau

Reputation: 495

What toolchain are you using? If you are using GCC, you can add the -save-temps option and check the test.i intermediate result to troubleshoot your problem.

I suspect you have a space between the x= and the =6.

Upvotes: 0

Barmar
Barmar

Reputation: 782653

The preprocessor doesn't work at the character level, it operates at the token level. So when it performs the substitution, you get something equivalent to:

if (x = = 6)

rather than your desired:

if (x==6)

There are some specific exceptions to this, like the # stringification operator.

Upvotes: 5

Related Questions