【问题标题】:Using #define the wrong way round works for calling functions. Why? [closed]以错误的方式使用#define 来调用函数。为什么? [关闭]
【发布时间】:2021-06-04 11:06:25
【问题描述】:

使用 #define 的 C 和 C++ 文档表明这不应该起作用,因为我使用定义将文本 MyFunc() 替换为 _myfunc() ,这是一个不存在的函数:

#define MyFunc _myfunc

void MyFunc()
{
    cout << "This Prints!" << endl;
}

int Main()
{
    _myfunc();
    return 0;
}

我的猜测是编译器很聪明。它知道 _myfunc() 不存在,因此不替换文本,简单地使用 MyFunc()。

我找不到任何文档来支持这一理论。有谁知道这是否正确?

【问题讨论】:

  • #define 是一个预处理器宏。预处理器在编译器之前运行,因此 - 编译器甚至看不到任何 #defines,所以它不能聪明(或不聪明)这些。
  • 您的猜测不正确。 void MyFunc()void _myfunc() 取代,因为这就是 #define 的工作方式,当 main 被编译时不会发生任何令人兴奋的事情。

标签: c++ c++11 c-preprocessor compiler-optimization cl


【解决方案1】:

预处理器运行后,您的程序将如下所示:

void _myfunc()
{
    cout << "This Prints!" << endl;
}

int Main()
{
    _myfunc();  // #1
    return 0;
}

这里忽略其他错误(缺少包含,...),编译器可以找到声明和定义的_myfunc,所以自然会在调用站点#1处通过重载解析找到。

【讨论】:

    猜你喜欢
    • 2014-08-30
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2020-12-18
    • 2022-01-10
    • 2022-11-24
    相关资源
    最近更新 更多