2

我有一个普遍的疑问..

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

4

6 回答 6

3

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

一旦定义了宏,它的值将在引用宏的任何地方使用,即使在其他文件中也是如此。

有关宏使用的详细信息,请参阅GCC 文档

于 2012-04-04T03:46:00.880 回答
3

一般的做法是#undef在你完成宏时使用它。容易出错,但它有效。

宏没有任何类型的块作用域。

于 2012-04-04T03:47:49.070 回答
2

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

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

于 2012-04-04T03:42:04.930 回答
2

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

于 2012-04-04T03:51:45.560 回答
0

宏由预处理器评估,而不是由编译器评估。它对编译单元一无所知,因此您不能将其限制为一个。相反,它在翻译单元内进行评估。

宏生命周期从它定义的行开始(它上面的所有行对宏一无所知),它在翻译单元的末尾或使用“#undef”未定义时结束

于 2012-04-09T14:48:13.187 回答
0

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

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

但是,使用宏可以轻松实现高阶函数。想想我们如何使用自然语言,我们可能会使用“它”来指代任何太长而无法在上下文中重复的事物。范围宏系统将启用相同的功能。

我开发了MyDef,它本质上是一个作用域宏系统。

于 2015-04-15T13:10:13.843 回答