预处理程序的令牌粘贴运算符##为什么不对变量起作用?

问题描述 投票:0回答:1
#if !defined(STDIO_H) && !defined(STDLIB_H)
    #include<stdio.h>
    #include<stdlib.h>
#endif
#if !defined(LIMITS_H)
    #include<limits.h>
#endif
#if !defined(MATH_H)
    #define pow(a,b)    {\
                            int i=1,p=1;\
                            while(i<=b)\
                            {\
                                p=p*a;\
                                i++;\
                            }\
                            printf("%d\n",p);\
                        }
    #define join(a,b)   a##b
#endif
int main()
{
    int a,b;
    printf("Enter a b : ");
    scanf("%d %d",&a,&b);
    pow(a,b);
    printf("%d\n",join(a,b));
    return 0;
}

错误在printf("%d",join(a,b));行中,但是如果我用诸如56和34之类的常量替换a和b,则它可以完美地工作。

#if!defined(STDIO_H)&&!defined(STDLIB_H)#include #include #endif #if!defined(LIMITS_H)#include #endif #if!defined(MATH_H)#...] >

c variables c-preprocessor
1个回答
4
投票

预处理程序在编译时运行。因此,“ ##”运算符在编译时进行评估。您不能将其与运行时确定的值一起使用。

这里发生的是a##b被简单地转换为ab,因此错误ab undefined

© www.soinside.com 2019 - 2024. All rights reserved.