设置MACRO的范围

时间:2012-04-04 03:39:48

标签: c macros

我有一个普遍的疑问..

有没有办法像。静态函数一样限制.C文件中MACRO的范围?

6 个答案:

答案 0 :(得分:3)

宏由预处理器完成。 预处理器读取正在处理的所有文件并应用宏和宏逻辑,然后将其结果传递给编译器。

定义一个宏后,即使在其他文件中,其值也将被引用宏

有关宏使用的详细信息,请参阅the GCC Documentation

答案 1 :(得分:3)

通常的做法是在完成宏后#undef。容易出错,但确实有效。

宏没有任何块范围。

答案 2 :(得分:2)

您可以将。宏文件放在要使用的.c文件中而不是头文件中,并且无法从其他文件访问它(尽管某些编译器允许包含.c文件但没有人这样做,没有一个是明智的。)

下面还提到了#undef的使用,但是如果你经常使用那个宏,它会很快变得混乱。

答案 3 :(得分:2)

所有宏都像静态函数一样,因为它们只能在定义它们的转换单元中使用。如果您想限制可以使用特定宏的区域,只需在合理的位置定义它。

答案 4 :(得分:0)

宏由预处理器评估,而不是由编译器评估。 它对编译单元一无所知,所以你不能将它的用途限制在一个。 相反,它在翻译单元内进行评估。

宏生命周期从它定义的行开始(它上面的所有行都对宏没有任何了解),它在转换单元的末尾或者使用“#undef”得到未定义时结束

答案 5 :(得分:0)

所有C宏仅限于翻译单元(单个C文件),除非它们在标题中定义并包含在每个翻译单元中。

不幸的是,翻译单元通常很大,很容易有数百到数千行代码,并且宏是依赖于上下文的,如果它可以限制在更小的上下文(例如块作用域)中则会更有用。缺乏范围限制了C中的宏使用,主要是全局常量,一些通用的简单例程,并且通常需要所有的大写名称或一些技巧来管理污染。)

但是,使用宏可以轻松实现更高阶的功能。想想我们如何使用自然语言,我们可以使用“它”来引用任何事情,在上下文中重复。范围宏系统将启用相同的功能。

我开发了MyDef,它本质上是一个范围宏系统。