在switch case语句中#define C ++关键字'case'?

时间:2016-06-22 13:03:20

标签: c++ macros

我正准备参加编码比赛,如果您的代码更短,您将获得奖励积分。我想知道是否可以从switch case语句'#define''case'关键字,这样如果我必须在竞争中使用switch case语句,我不必在switch中反复输入'case'关键字言。

示例代码段:

             switch(input_string[0])
        {
            case '+':p = (a + b);t;
            case '-':p = (a - b);t;
            case '*':p = (a * b);t;
            case '/':p = (a / b);t;
            case '%':p = (a % b);t;
            case '^':p = pow(a,b);t;
        }

a,b和p是整数。当字符input_string [0]为'+'时,添加a和b,并将总和分配给p。

重要提示:上面代码段中的't'是break语句。我用'#define t break;'所以我不必多次写break关键字。我想知道是否可以使用'case'关键字做同样的事情。

我可以将case定义为'#define c case',并在switch case case语句中使用'case'的地方使用'c',以便生成的代码片段如下所示:

        switch(e[i])
        {
            c '+':p = (a + b);t;
            c '-':p = (a - b);t;
            c '*':p = (a * b);t;
            c '/':p = (a / b);t;
            c '%':p = (a % b);t;
            c '^':p = pow(a,b);t;
        }

我尝试过'#define c case',但我收到以下错误 - “错误:表达前预期'case'关键字”

3 个答案:

答案 0 :(得分:2)

我建议不这样做。但是,如果你这样做,请立即取消定义立即,否则会看到c任何地方都会发生非常糟糕的事情,无论在哪种情况下

    #define c case
    #define t break;
    switch(e[i])
    {
        c '+':p = (a + b);t;
        c '-':p = (a - b);t;
        c '*':p = (a * b);t;
        c '/':p = (a / b);t;
        c '%':p = (a % b);t;
    }
    #undef c
    #undef t

在这种情况下,处理器基本上是一个令牌替换工具,将在实际编译之前运行。

这比原始代码更短:

#define c case
#define t break
switch(e[i]){c'+':p=(a+b);t;c'-':p=(a-b);t;c'*':p=(a*b);t;c'/':p=(a/b);t;c'%':p=(a % b);t;c'^':p=pow(a,b);}
#undef c
#undef t

正如您所看到的,除了代码混淆挑战外,更短是一个非常糟糕的主意

答案 1 :(得分:0)

你可以这样做,是的。如果需要,可以用宏替换任何C ++关键字。

但是,您需要注意不要与任何现有标识符冲突。请记住,如果您在其他任何地方使用c令牌,那么在预处理器运行时它也会变成“大小写”。

P.S。如果代码短缺是通过字面上的程序中最少的字符数来量化的,那就摆脱那个讨厌的空白。

答案 2 :(得分:0)

如果你想要的话,你需要做#define c case。您尝试执行的操作是将所有c替换为case,而不是将所有case替换为c。那就是:

#define c case

switch(e[i])
    {
        c '+':p = (a + b);t;
        c '-':p = (a - b);t;
        c '*':p = (a * b);t;
        c '/':p = (a / b);t;
        c '%':p = (a % b);t;
        c '^':p = pow(a,b);t;
    }