【问题标题】:For loop in #define#define 中的 for 循环
【发布时间】:2011-02-03 06:11:17
【问题描述】:
#include <stdio.h>
#define UNITS {'*', '#', '%', '!', '+', '$', '=', '-'}

#define PrintDigit(c, d) (for (i=0; i < c ; i++)putchar(unit[d]);)

char unit[] = UNITS;

//void PrintDigit(c, element) {
//  int i;
//  for (i=0; i < c ; i++)
//      putchar(unit[element]);
//}


int main( ) {
    int i, element=4;
    PrintDigit(10, element);
    putchar('\n');
    return 0;
}

我在这里有PrintDigit() 的功能,它按预期工作。当尝试将函数转换为 #define 时,gcc 不断在 for 循环中抛出语法错误。知道问题出在哪里吗?

【问题讨论】:

    标签: c loops for-loop c-preprocessor


    【解决方案1】:

    您已将 for 循环括在括号中,您需要将其删除。

    改变

    #define PrintDigit(c, d) (for(i=0; i < c ; i++)putchar(unit[d]);)
    

    #define PrintDigit(c, d) for(i=0; i < c ; i++)putchar(unit[d]);
    

    编辑:

    原因是 C 语法不允许 statement(在这种情况下为 iterative 语句)在括号内,但允许 expression

    你可以看看C语法here

    【讨论】:

    • 该死,括号有问题吗?努力想知道为什么这是一个问题。谢谢你!
    【解决方案2】:

    这是一个糟糕的主意......你应该把它变成一个 inline 函数。但是,问题是您将定义括在括号中,这使得它不正确。删除括号并删除末尾的分号(以便您可以在其后放置一个分号),它应该可以工作。

    换句话说,将您的定义更改为:

    #define PrintDigit(c, d) \ 对于 (int i = 0; i

    您可以通过将其放入内部范围来使其不那么脆弱:

    #define PrintDigit(c,d) \ 做{\ 对于 (int i = 0; i

    【讨论】:

    • 您是否需要整个 do{}while(0) 部分不是一对 oof 大括号 {} 也能做到吗?
    • @Jackson,不,因为分号。
    【解决方案3】:
        #include <stdio.h>
        #define UNITS {'*', '#', '%', '!', '+', '$', '=', '-'}
    
        #define PrintDigit(c, d) for (i=0; i < c ; i++)putchar(unit[d]);
    
        char unit[] = UNITS;
    
        //void PrintDigit(c, element) {
        //  int i;
        //  for (i=0; i < c ; i++)
        //      putchar(unit[element]);
        //}
    
    
        int main( ) {
        int i, element=4;
        PrintDigit(10, element);
        putchar('\n');
        return 0;
    }
    

    你需要去掉for中的() 之前和结尾的语句

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 2021-07-30
      相关资源
      最近更新 更多