2012-01-12 72 views
2
#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"); 
} 

我得到:爲什麼此C字符串宏在擴展時會損壞?

之一的A-1

而不是

之一的一個Linux的

注意, 「LINUX」 變爲 「1」 - 即數字1

+1

這意味着'linux'是一個評估爲'1'的宏。 – fge 2012-01-12 15:23:05

+0

如果您使用的是gcc,您可能需要嘗試使用'-std = c89'或'-std = c99'來避免此問題。 – 2012-01-12 15:29:14

+0

@CharlesBailey:第三方的好奇心,爲什麼會有幫助? – 2012-01-12 15:30:42

回答

3

顯然有#define linux 1某處(或-Dlinux=1)。

1
#undef linux 
#define TEST one-of-a-linux 
+0

在一般情況下,可能不想這樣做,以防其他系統頭文件(可能使用'linux')被包含在內。 – 2012-01-12 15:29:12

+0

'undef linux'後面可以跟'#define linux linux' – ugoren 2012-01-12 15:44:20

+0

@DanFego:如果後面緊跟着主例如給出的例子,否則不行。一般來說,你不會在頭上做這個... – 2012-01-12 16:03:58

3

在我的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在UNIX平臺上爲1的值在IOCCC條目被使用。在1987年

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

代碼 「最佳一班輪」 的獲獎者是:

main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);} 
0

你在你的代碼的某個地方有linux1一個#define。以下工作正常!

#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 

打印適當的期望答案!