Почему оператор вставки токена препроцессора ## не работает с переменными? - PullRequest
0 голосов
/ 27 октября 2019
#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));, но она прекрасно работает, если я заменяю a & b на константы, такие как 56 и 34. Ошибка - это необъявленное первое использование в функции.

1 Ответ

4 голосов
/ 27 октября 2019

Препроцессор работает во время компиляции. Таким образом, оператор '##' вычисляется во время компиляции. Вы не можете использовать его со значениями, которые определены во время выполнения.

Здесь происходит то, что a##b просто переводится в ab, следовательно, ошибка ab undefined.

...