Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

OK, I've now tested. For this test code:

  #define FOO
  #define BAR defined(FOO)
  #if BAR
  #error "true"
  #else
  #error "false"
  #endif
Clang, GCC, and ICC evaluate the "true" branch, while MSVC evaluates the "false" branch.

For the same test code with first line changed to "undef":

  #undef FOO
  #define BAR defined(FOO)
  #if BAR
  #error "true"
  #else
  #error "false"
  #endif
MSVC, Clang, GCC, and ICC all agree on "false".

Importantly, though, when used with "/Wall", MSVC gives this error message in both cases:

  main.cpp(3): warning C4668: 'definedFOO' is not defined as
     a preprocessor macro, replacing with '0' for '#if/#elif'
None of the other three compilers give any warnings even with '-Wall -Wextra -pedantic". So there definitely is a difference in behavior, but I don't think it's actually the one that's presumed in that bug.

For further experimentation, Clang, GCC, and ICC can be tested online here: http://gcc.godbolt.org/

And MSVC can be tested online here: http://webcompiler.cloudapp.net/



According to the link posted by evmar, clang warns on this starting at r258128.




Consider applying for YC's Winter 2027 batch! Applications are open till November 2.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: