C 执行标记粘贴的宏中的标记未声明错误

C 执行标记粘贴的宏中的标记未声明错误,c,macros,C,Macros,我没有在这里发布确切的代码,但我已经尝试完整地描述了这个问题。我有以下宏- #define TKN_PST(P) (ABC_##P) 此宏在另一个宏的定义中调用,该宏本身从另一个宏调用,如下所示- #define CREATE_TOKEN(P) FURTHER_PROC(P) #define FURTHER_PROC(X) foo(a, b, TKN_PST(X), ...) #define FURTHER_PROC(X) FURTHER_PROC2(X) #define FURTHER_P

我没有在这里发布确切的代码,但我已经尝试完整地描述了这个问题。我有以下宏-

#define TKN_PST(P) (ABC_##P)
此宏在另一个宏的定义中调用,该宏本身从另一个宏调用,如下所示-

#define CREATE_TOKEN(P) FURTHER_PROC(P)
#define FURTHER_PROC(X) foo(a, b, TKN_PST(X), ...)
#define FURTHER_PROC(X) FURTHER_PROC2(X)
#define FURTHER_PROC2(X) foo(a, b, TKN_PST(X), ...)
foo()是一个接受可变数量参数的函数

我调用
CREATE\u TOKEN(p)
时出错。编译器告诉我,
ABC\uu
未声明

此问题仅在调用
CREATE\u-TOKEN(p)
时发生,而对于
CREATE\u-TOKEN(Q)
CREATE\u-TOKEN(R)
等,则不会发生。我怀疑此问题可能是由于p在大型代码库中的某个地方有一个定义

我尝试引入一个额外的间接层次,如下所示-

#define CREATE_TOKEN(P) FURTHER_PROC(P)
#define FURTHER_PROC(X) foo(a, b, TKN_PST(X), ...)
#define FURTHER_PROC(X) FURTHER_PROC2(X)
#define FURTHER_PROC2(X) foo(a, b, TKN_PST(X), ...)
然后,
CREATE_-TOKEN(Q)
CREATE_-TOKEN(R)
,etc开始失败,出现错误“)”,预期在


这个问题的原因可能是什么?

感谢paulsm4为我指出了正确的方向,他在上面的评论

我能够在包含的文件中找到“p”的定义(#define),该文件没有替换文本。
我没有考虑过这种可能性。

如你所知,
ABC_uuuuuuuuu是未声明的
意味着你的预处理器将“TKN_PST(p)”中的“p”扩展为“”。因为“Q”和“R”似乎起作用。。。我同意你的猜测,“P”本身就是一个宏,定义为“其他地方”。建议:使用
-E
(或编译器的等效工具)编译以调试宏扩展。感谢您的评论。我确实在其他地方找到了一个定义,它包含在定义这些宏的文件中。这个定义只是一个没有替换文本的定义。