代码之家  ›  专栏  ›  技术社区  ›  Ande Turner

个人预处理器指令

  •  1
  • Ande Turner  · 技术社区  · 17 年前

    作为一个 C 新手我想听听宏“定义”的开发者在使用什么。我一直在考虑将这些内容放在标题中,以跳过我已经习惯的冗长内容:

    #define TS_ typedef struct {  
    #define _TS(x) } x;
    
    #define I(x)_ { int i; for ( i = 1; i <= x; i++ ) {  
    #define _I } }
    

    #define TS_ typedef struct {\n
    #define _TS(x) } x;\n
    
    #define I(x)_ { int i;\n\tfor ( i = 1; i <= x; i++ ) {\n 
    #define _I \t}\n}\n
    

    这些有用吗?

    ie:我可以使用proprocessor将我的源代码替换为没有包含的个人包含到格式化源代码吗?

    链接到好的预处理器提示和技巧也很感激。

    9 回复  |  直到 10 年前
        1
  •  16
  •   Jonathan Leffler    9 年前

    此外,我想说的是,你建议的宏都是非常糟糕的想法,因为它们向读者隐藏了正在发生的事情。它们的唯一理由似乎是为您节省了很少的打字量。通常,只有在没有合理的替代方案时才应该使用宏。在这种情况下,有一种方法——只需编写代码。

        2
  •  6
  •   jcoder    17 年前

    可以 通过转义换行符来添加空格

    #define SOMETHING whatever\
    This is part of the macro
    

    但正如其他人所说,这并不是一个很好的方法。

    最好是查看编辑器宏,以便键入快捷方式并让编辑器展开它。

        3
  •  4
  •   Eli Bendersky    17 年前

    你走错了路。 不要

    试着找一些好的C代码来阅读——好的C代码不使用这些东西,有一个很好的理由。

        4
  •  3
  •   Fritz    11 年前

    作为一个警告性的例子,请查看 Steve Bourne's original sources for the Bourne shell ,他使用宏以一种洋泾浜-阿尔戈尔风格编写代码。

        5
  •  1
  •   Greg Hewgill    17 年前

    这样做,但是这种“个人语言”在C世界中并不普遍使用,特别是如果您希望将来有人阅读您的代码。

    如果你这样做只是为了你自己,那么请放心 #define 不管你想要什么,但是一旦你开始与其他人(或为其他人)合作,你就不能继续使用这种东西了。

        6
  •  1
  •   Community Mohan Dere    9 年前

    不必要地使用C宏会让您陷入痛苦的世界,特别是当您试图使用它来扩展代码时。C宏有一些用途,但不是这样。

    here .

        7
  •  0
  •   William Pursell    17 年前

    总的来说,我非常同意其他受访者的看法,他们告诉您不要纯粹为了保存键入而定义自己的宏。这种混淆不值得。此外,您所建议的特定宏也是令人发指的。然而,在Stroustrup的第1版中,他做了一些我比较喜欢的事情(有时):

    #define Kase break; case
    
        8
  •  0
  •   Imagist    17 年前

    我已经习惯了Python elif构造,因此我经常定义以下内容:

    #define elif(test) else if(test)
    

    不是吗 为了减少键入,需要在保持代码宽度一致的同时保持缩进的逻辑性(我的代码宽度不会超过80个字符)。我这么说是因为对我来说。。。

    if(...) ...
    else if(...) ...
    else ...
    

    if(...)
    {
        ...
    }
    
    else
        if(...)
        {
            ...
        }
    
        else
        {
            ...
        }
    

    对于我的宏,这将变成:

    if(...)
    {
        ...
    }
    
    elif(...)
    {
        ...
    }
    
    else
    {
        ...
    }
    
        9
  •  0
  •   mallik    17 年前

    最好将循环变量传递给宏。 块-宏有一定的优化问题。所有编译器都不保证“块范围”变量的优化obj代码。

    例如,以下代码在编译时不向gcc输出任何优化选项,为&打印两个单独的地址;我当使用-O2选项编译时,相同的代码将在两个块中打印相同的地址。

    {
        int i;
        printf("address of i in first block is %u\n", &i);
    }
    {
        int i;
        printf("address of i in sec block is %u\n", &i);
    }
    

    适当地命名语言结构可以使代码更具可读性。 我喜欢你的想法,如果你用下面的方式表达的话。

    #define GREEN 1
    #define YELLOW 2
    #define RED 3
    
    # define NUM_COLORS 3
    
    #define COLOR_ITER (color,i)           \
        for(i=GREEN, color = colors[i];    \
            i < NUM_COLORS;                \
            color = colors[++i])
    
    int colors[3] = {GREEN, YELLOW, RED};
    
    int
    fun () {
    
        int j;
        color_t clr;
    
        COLOR_ITER(clr, j) {
            paint(clr);
        }
    
    }
    

    在这里,不管它是如何编写的,宏COLOR_ITER(其名称)意味着您正在循环查找所有可用的颜色,并对每种颜色执行“操作”。这是一个非常容易使用的宏。

    我是否可以使用proprocessor将我的源代码替换为我的个人include to格式化源代码,而不使用include?

    正如大家所解释的,在这种情况下,预处理器不会帮助您。 您可以使用编辑器命令在键入代码时自动格式化代码。