2009-08-01 82 views
1

作为C新手我想听听Macro“define”开发人员正在使用什么。我一直在思考把这些在头跳过冗长我已经习惯于:个人预处理器指令

#define TS_ typedef struct { 
#define _TS(x) } x; 

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

我可以添加这些宏内\ n \ t等?正如我想通过我的源代码减去额外包括:

#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:我可以使用协处理器将我的源代码替换为我的个人包含格式化的源代码,而不包含?

链接到良好的预处理器的提示和技巧也赞赏。

+3

我不明白。为什么你想把空格放入宏?由于预处理源不会被人类看到(通常),因此它不会提高可读性。 – 2009-08-01 09:03:59

+2

正如其他人所说,使用C预处理器试图重写C语法通常被认为是不好的形式。也取决于你如何做到这一点,你可能会在这里结束http://thedailywtf.com/Articles/The_Secret_to_Better_C.aspx – Falaina 2009-08-01 10:27:46

回答

6

可以把空格中通过转义换行符

#define SOMETHING whatever\ 
This is part of the macro 

但正如其他人说这是不是真的要做到这一点的好方法。

查看编辑宏可以更好地输入快捷方式并让编辑器扩展它。

16

在开始之前,请不要使用以下划线开头的宏名 - 这些是为编译器和标准库编写器保留的,不能用于您自己的代码中。

此外,我会说你建议的宏都是非常糟糕的想法,因为它们隐藏了读者所发生的事情。他们唯一的理由似乎是为您节省很少量的打字。通常,只有在没有明智的选择时才使用宏。在这种情况下有一个 - 只需编写代码。

1

可能做到这一点,但这种“个人语言”通常不在C世界中使用,特别是如果你期望其他人在未来阅读你的代码。

如果你只是为自己做这件事,然后随意#define任何你想要的,但期望一旦你开始与任何人(或为)任何人工作,你将无法继续使用这种事情。

+0

@Greg:这就是为什么我问我是否可以使用预处理器来创建我可以然后传递。你读过第一个代码块吗? – 2009-08-01 09:05:54

+0

我确实。我不太明白你的意思是“传递”。请注意,不仅运行预处理器将替换*您的*宏,而且它还将替换代码中声明和使用的所有其他宏。你不能要求它只应用一个特定的宏子集。 – 2009-08-01 09:08:50

1

不必要地使用C宏会导致您陷入痛苦的世界,特别是如果您尝试使用它来扩展代码。 C宏有用途,但这不是它。

编辑:我意识到我的回答与你的问题是相切的,但我认为我应该提到这点,因为你说你是C新手。搜索“C宏陷阱”以获得不使用宏的完整列表。之前已经讨论过here

4

你正在走向错误的道路。 不要组成你自己的cpp指令,这些指令对别人不熟悉 - 这会使你的代码难以理解,并在某些时候保持不变。

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

0

总的来说,我非常同意其他的答复者,他们告诉你不要纯粹为了保存输入而定义自己的宏。迷惑不值得。另外,你所建议的特定宏是可恶的。然而,在Stroustrup的第1版,他做的东西我比较喜欢(有时):

 
#define Kase break; case 
0

我就习惯了Python的elif的结构,所以我经常定义如下:

#define elif(test) else if(test) 

我的目的这样做是不是减少键入,它是保持合理的缩进逻辑,同时保持一致的代码宽度(我不让我的代码宽度超过80个字符)。我这么说是因为我这...

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

...应该是...

if(...) 
{ 
    ... 
} 

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

    else 
    { 
     ... 
    } 

用我的宏变为:

if(...) 
{ 
    ... 
} 

elif(...) 
{ 
    ... 
} 

else 
{ 
    ... 
} 
0

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

例如,以下代码在编译时未将任何优化选项编译为gcc时,会为& i打印两个单独的地址。当使用-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,它的名​​字,意味着你是循环的所有可用的颜色和做“事”为每一种颜色。这是一个非常易于使用的宏。

而且你quesion

我可以使用proprocessor与我个人来代替我的源代码包括以格式化源不包括哪些内容?

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