gpt4 book ai didi

c++ - isupper() 是宏还是函数?

转载 作者:行者123 更新时间:2023-12-01 14:03:32 24 4
gpt4 key购买 nike

我正在阅读一本关于 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 段中:

    Any function declared in a header may be additionally implemented as a function-like macro defined in the header… Any invocation of a library function that is implemented as a macro shall expand to code that evaluates each of its arguments exactly once, fully protected by parentheses where necessary, so it is generally safe to use arbitrary expressions as arguments.



    宏可以由标准库实现定义以提供效率(尽管这不像以前那么重要,现在大多数编译器都会内联函数),但函数也需要定义为具有完全相同的函数语义,这意味着您可以在不包含 header 的情况下使用该函数(只要您提供正确的函数原型(prototype)),并且您可以获取函数的地址。

    而且,正如我引用的第二句话中所指出的,您不必担心宏可能会产生奇怪的副作用,例如对其参数进行多次评估 -- 除非功能说明另有说明。 (一个这样的函数是 getc ,它在语义上与 fgetc 相同,除了 getc 允许实现为不止一次评估其参数的宏。)

    这些函数从来都不是只作为宏实现的(至少,不是在符合标准的库中)。但是曾经有一段时间,将简单的函数也实现为宏非常普遍,以至于有些人只是指望现有的宏。或者谈论它们,好像那是唯一的实现。

    在 C++ 中都不是这种情况。 C++ 要求函数是函数(宏是宏),并且函数在命名空间中。这并没有使 C++ 与 C 不兼容;仅需要声明与 C 共享的函数的 C++ 头文件(即名称以 c 开头的函数)到 #undef包括相应的 C 头文件后的所有(潜在)宏定义。

    关于c++ - isupper() 是宏还是函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61049359/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com