【问题标题】:Simplifying coding using macro definitions使用宏定义简化编码
【发布时间】:2013-12-31 01:05:36
【问题描述】:

我试图想办法防止每次都写typedef struct 然后我发现我可以通过这种方式使用宏定义来做到这一点:

#include <stdio.h>
#include <stdlib.h>
#define struct_t typedef struct

struct_t list {
    int id;
    struct list *next;
} list;

int main(void)
{
    list *element = (list *)malloc(sizeof(list));
    element->id = 7;
    element->next = NULL;

    printf("ID: %d\nNEXT: %p", element->id, element->next);
    return 0;
}

结构只是一个例子:整个想法都是关于简化编码。

使用宏来简化编码是一种好习惯吗?或者它可能会导致一些问题?

除了使用 maroc 定义之外,还有什么方法可以简化编码?

【问题讨论】:

  • 请不要这样做。 使用宏来替换语言的任意部分是邪恶的。选择的名称更糟糕:它看起来好像它本身就是一个类型名称。
  • @FiddlingBits 抱歉,这与简化编码无关。检查新标题
  • @rullof 哦,我现在明白了。
  • (最好的事情是我知道我将在前 10 分钟内获得超过 5 个赞。)
  • 根本没有必要对结构使用 typedef。您可以只写struct list { /* ... /* };,然后将类型称为struct list

标签: c macros


【解决方案1】:

尽管宏在简化繁琐、重复的编码任务方面确实占有一席之地,但这并不是它们有用的地方之一:每个 struct 可以节省六个字符,不会帮助您隐藏任何复杂性,而同时为您的代码的读者引入了可读性问题。

如果您希望节省一些输入,在这种情况下,更好的方法可能是在您最喜欢的 IDE 或代码编辑器中定义一个宏。

虽然制定决定使用宏的规则非常困难,但通常在做出决定时应考虑以下几点:

  • 宏会简化复杂的代码块吗? - 如果答案为“否”,则不应为其创建宏。
  • 宏会为一小段代码提供一个好听的名称吗? - 宏在这里可能是一个不错的选择。另一种选择可能是内联函数。
  • 您要替换单一语言结构吗? - 如果答案是“是”,您应该避免使用宏。

【讨论】:

    【解决方案2】:

    使用宏来“隐藏”事物是不好的做法。所有阅读您的代码的人都应该非常清楚每一件事是什么。我的建议是仅将宏用于简单定义,例如 ...

    #define MAX_NUM (10)
    

    ... 或者在无法定义函数或更复杂的情况下。我想不出一个很好的例子,但也许这不能很好地说明罕见的例外之一......

    #define TRY(test)        if(test != 0)  \ 
                                 goto fail; \
    #define FAIL(fail_block) {              \
                                 fail:      \
                                 fail_block \
                             }              \
    

    【讨论】:

    • Dat 伪异常处理程序...! (不过,我仍然会使用函数和 longjmp() 来做到这一点。)
    • @H2CO3 没想到。我很难想出一个使用宏的好理由!大声笑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多