定义body是另一个定义

时间:2015-05-12 18:39:09

标签: c c-preprocessor

我无法明确找到答案,似乎在实践中有效:

// example #1
#define test 5
#define test2 test

(test2 == 5) == true

即便如此:

// example #2
#define test2 test
#define test 5

是否有明确的 C 规范规则允许此操作。我认为预处理器非常简单,它只是找到/替换。但我想在#define test2 test的情况下它知道test不是字符串,所以它可能是define?那么预处理器只对这种情况进行多次扫描?

我的主要问题,为什么我的例子#2有效?

2 个答案:

答案 0 :(得分:1)

预处理结果:

pcor.test

给出:

# Sample dataset with 5 columns
set.seed(144)
dat <- matrix(rnorm(1000), ncol=5)

# Compute the 4x4 correlation matrix, controlling for the fifth column
library(ppcor)
sapply(1:(ncol(dat)-1), function(x) sapply(1:(ncol(dat)-1), function(y) {
  if (x == y) 1
  else pcor.test(dat[,x], dat[,y], dat[,ncol(dat)])$estimate
}))
#              [,1]        [,2]       [,3]        [,4]
# [1,]  1.000000000 -0.01885158 0.06037621 0.004032437
# [2,] -0.018851576  1.00000000 0.09560611 0.097152907
# [3,]  0.060376208  0.09560611 1.00000000 0.105123093
# [4,]  0.004032437  0.09715291 0.10512309 1.000000000

即使在#define test2 test #define test 5 test2 test 之后定义了5 5 。预处理器按照以下指定重新扫描源:

  

(C99,6.10.3.4重新扫描并进一步替换p1)&#34;替换列表中的所有参数都已被替换并且#和##处理已经发生,所有地标标记预处理标记都被删除。然后重新扫描生成的预处理标记序列以及所有后续标记序列   预处理源文件的标记,以便更换更多的宏名称。&#34;

答案 1 :(得分:0)

如何处理第一个:

#define test 5
#define test2 test
something with test
something with test2

#define test2 5
something with 5
something with test2

something with 5
something with 5

如何处理第二个:

#define test2 test
#define test 5
something with test
something with test2

#define test 5
something with test
something with test

something with 5
something with 5