Skip to content

Instantly share code, notes, and snippets.

@aprell
Created July 26, 2013 18:07
Show Gist options
  • Select an option

  • Save aprell/6090933 to your computer and use it in GitHub Desktop.

Select an option

Save aprell/6090933 to your computer and use it in GitHub Desktop.
Reminder: Never ever make this mistake again.
#include <stdio.h>
#define A baz
int main(void)
{
#if A == foo || A == bar
printf("Wrooong!\n");
#endif
return 0;
}
#include <stdio.h>
#define foo 1
#define bar 2
#define baz 3
#define A baz
int main(void)
{
#if A == foo || A == bar
printf("Right!\n");
#endif
return 0;
}
@jjkress
Copy link
Copy Markdown

jjkress commented Jul 26, 2013

Hätte nicht auch folgendes gehen können:

#define A #baz

int main(void)
{
#if A == #foo || A == #bar
    printf("Right?\n");
#endif
    return 0;
}

Bin zu faul den compiler anzuschmeißen ;)

@jjkress
Copy link
Copy Markdown

jjkress commented Jul 26, 2013

Laut Doku müsste das gehen, tut es aber nicht, obwohl in der Expansion das richtige raus kommt (ich hab den Compiler doch angeschmissen):

#include <stdio.h>

#define A baz
#define exp(x) str(x)
#define str(x) #x

int main(void)
{
#if A == "foo"
    printf("Wrooong!\n");
#endif
    return 0;
}

@aprell
Copy link
Copy Markdown
Author

aprell commented Jul 27, 2013

Wenn der Präprozessor wenigstens warnen würde, dass er keine Zeichenketten vergleichen kann...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment