the*_*ish 4 c++ macros function c-preprocessor
我正在阅读一本关于 c++ 的书(Ulla Kirch-Prinz 和 Peter Prinz 编写的 C++ 编程完整指南;ISBN:0-7637-1817-3),它提到 isupper()、islower()、isalpha( )、isdigit()、isalnum()、isspace() 和 isprint() 是用于字符分类的宏。
我觉得这种奇怪有两个原因:
在同一本书中,它讨论了如何,即使宏可以有参数,它们本质上仍然只是用定义填充的占位符名称。这看起来很奇怪,因为我不知道有条件地操作什么样的替换文本。这听起来更符合函数或内置操作(如sizeof)。
这似乎也很奇怪,因为我听说有些人称这些函数,而我也听到有些人称它们为宏。
任何解释将不胜感激。我对此比较陌生,所以我仍在努力弄清楚这一切。谢谢你。
标准 C(据我所知,在其所有版本中)允许将任何标准库函数也定义为宏。在当前的 C 标准中,它隐藏在第 7.1.4 节(库函数的使用)的第 1 段中:
在头文件中声明的任何函数都可以另外实现为在头文件中定义的类似函数的宏......任何作为宏实现的库函数的调用都应扩展为对每个参数只求一次值的代码,完全受括号保护在必要时,使用任意表达式作为参数通常是安全的。
宏可以由标准库实现定义以提供效率(虽然这不像以前那么重要,现在大多数编译器都会内联函数),但函数也需要定义为具有完全相同的函数语义,这意味着您可以在不包含标题的情况下使用该函数(只要您提供正确的函数原型)并且您可以获取该函数的地址。
而且,正如我引用的第二句话中所指出的,您不必担心宏可能的奇怪副作用,例如对它们的参数进行多次计算——除非函数的描述另有说明。(一个这样的函数是getc,它在语义上与fgetc除了getc被允许实现为一个不只计算一次其参数的宏之外是相同的。)
这些函数从来都不是只作为宏实现的(至少,不是在符合标准的库中)。但是曾经有一段时间,将简单的函数也实现为宏是如此普遍,以至于有些人只是依靠现有的宏。或者谈论它们,好像这是唯一的实现。
在 C++ 中,这些都不是。C++ 要求函数是函数(宏是宏),并且函数在命名空间中。这并没有使 C++ 与 C 不兼容;在包含相应的 C 头文件之后,C++ 头文件只需要声明与 C 共享的函数(即名称以 开头的函数c)到#undef所有(潜在的)宏定义。
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |