Почему этот макрос C-строки повреждается при расширении? - PullRequest
2 голосов
/ 12 января 2012
#include <stdio.h>

#define QUOTE(str) #str
#define EXPAND_AND_QUOTE(str) QUOTE(str)
#define TEST one-of-a-linux

int main() {
  printf(EXPAND_AND_QUOTE(TEST)"\n");
}

Я получаю:

один-в-а-1

вместо

один-в-а-Linux

Обратите внимание, что "linux" становится "1", т. Е. Цифрой один

Ответы [ 4 ]

3 голосов
/ 12 января 2012

На моей Linux-коробке:

$ gcc -dM -E - < /dev/null | grep 'linux\|unix'
#define __unix__ 1
#define __linux 1
#define __unix 1
#define __linux__ 1
#define __gnu_linux__ 1
#define unix 1
#define linux 1
$

Обратите внимание, что значение unix, равное 1 на платформах Unix, использовалось в записи IOCCC. Лауреат "Лучшего лайнера" ​​1987 года.

http://www.ioccc.org/years.html#1987_korn

Код был:

    main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
3 голосов
/ 12 января 2012

Очевидно, что где-то #define linux 1 (или -Dlinux=1).

1 голос
/ 12 января 2012
#undef linux
#define TEST one-of-a-linux
0 голосов
/ 12 января 2012

У вас есть #define для linux до 1 где-то в вашем коде. Следующее работает отлично!

#include <stdio.h>

#undef linux

#define QUOTE(str) #str
#define EXPAND_AND_QUOTE(str) QUOTE(str)
#define TEST one-of-a-linux

int main(void) 
{
    printf(EXPAND_AND_QUOTE(TEST)"\n");
    return 0;
}

Выход:

/*
$ gcc mm.c 
$ ./a.out 
one-of-a-linux
$ 
*/

Примечание:

#define TEST 1linux
#define TEST linux1

печатает ожидаемые ответы соответствующим образом!

...