Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does the compiler error "missing binary operator before token" mean?

I recently got the following error when trying to compile with gcc:

error: missing binary operator before token "("

Web and SO searches came up with several specific examples of this error, with specific code changes to fix them. But I found no general description of what condition causes this error to be issued.

When and why does gcc emit this error?

like image 918
AShelly Avatar asked Jan 24 '14 17:01

AShelly


3 Answers

This is not a compiler error, it is a preprocessor error. It occurs when the preprocessor encounters invalid syntax while trying to evaluate an expression in a #if or #elif directive.

One common cause is the sizeof operator in an #if directive:

For example:

  #define NBITS (sizeof(TYPE)*8)
  //later
  #if (NBITS>16)    //ERROR

This is an error because sizeof is evaluated by the compiler, not the preprocesor.

Type casts are also not valid preprocessor syntax:

  #define ALLBITS ((unsigned int) -1)
  //later
  #if (ALLBITS>0xFFFF)    //ERROR

The rules for what can be in a valid expression are here.

Note also that #if will evaluate an undefined macro as 0, unless it looks like it takes arguments, in which case you also get this error:

So if THIS is undefined:

#if THIS == 0  //valid, true

#if THIS > 0 //valid, false

#if THIS() == 0  //invalid. ERROR

Typos in your #if statement can also cause this message.

like image 65
AShelly Avatar answered Nov 13 '22 04:11

AShelly


If you are on Linux, make sure that you do not have a header named features.h inside your project files. I had one with this name, which resulted in:

/usr/include/x86_64-linux-gnu/bits/huge_val.h:25: error: function pointer expected

or

/usr/include/bits/huge_val.h:26:18: error: missing binary operator before token "("

That is because some system headers like huge_val.h use macros like __GNUC_PREREQ that are defined by /usr/include/features.h (learn more about this header in this SO question).

In my case I first saw this error when I started to use gcc's -I option which suddenly made gcc select my project include directory before the default system include directories.

like image 21
Gabriel Devillers Avatar answered Nov 13 '22 06:11

Gabriel Devillers


You get this error sometimes if you have -fno-operator-names in your compiler flags. I suffered from the exact error while building json and this solved it.

like image 1
Yusuf Gören Avatar answered Nov 13 '22 06:11

Yusuf Gören