我无法明确找到答案,似乎在实践中有效:
// 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有效?
答案 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