【问题标题】:replacing all function calls with their definition in a C/C++ code用 C/C++ 代码中的定义替换所有函数调用
【发布时间】:2012-06-26 15:59:48
【问题描述】:

我想知道是否有一些理论/工具可用于将包含函数调用的一段代码替换为所有函数调用已被各自代码替换的代码。

喜欢

main()
{
   fun();
}

fun()
{
   int i;
   fun2();
}

fun2()
{
   int j;
}

进入

main()
{
   int i;
   int j;
}

我知道有很多事情需要处理,比如局部变量名、递归调用、外部函数调用等...... ..

我也知道它可能根本没有用,但仍然存在这样的东西吗?即使在理论上?

我应该称它为提前每个处理器单元吗:)

【问题讨论】:

  • 我称之为优化编译器:)
  • C 预处理器的作用与此惊人地相似。
  • 如果您保留{},即main() { {int i;} {int j} },处理局部变量实际上非常容易
  • 编译器可以从函数内联生成代码。一些程序验证器也通过这种方式基本上扁平化程序来工作。然而,前者通常不会以可读的形式提供它们的中间结果。后者需要相当重写才能产生正确的结果。
  • 这是什么语言?您的函数没有返回值,因此它们与 C 或 C++ 不匹配。

标签: c++ c compiler-construction theory compiler-theory


【解决方案1】:

编译器通常可以判断何时执行此操作是个好主意,并且已经自动执行inlining whenever needed。您还可以建议在函数之前使用 inline 关键字对函数进行内联(请注意,它实际上仍然不会强制执行,编译器可能会决定避免内联)。这通常不是一个好主意手动执行此操作,因为现代编译器倾向于自行找出最佳内联。 This article explains inline functions really well, I found it very helpful

编辑 1:

您所说的内联可能有多种原因。如果您觉得您的代码被划分为许多不同的功能会降低其清晰度并使其过于冗长,您可以尝试使用重构工具,例如 VAssist X Visual Studio plugin 提供的工具。虽然这个插件并没有真正按照你的建议去做(我想不出有什么工具能做到),但它可以帮助轻松移动函数/方法,让你清理代码。

【讨论】:

  • 一件事:使用inline是对编译器的建议;它不会强制它内联函数。 FAQ-Lite 链接中的问题 9.1 解释了这一点。
  • inline 关键字不强制内联。它主要用于避免违反 ODR。
  • inline 关键字实际上并不强制内联。事实上,许多编译器忽略了它作为内联的提示,而只是依赖于他们自己的启发式方法。所有内联真正做的是允许在多个翻译单元中定义函数而不会导致链接器错误:stackoverflow.com/a/157929/365496
  • 一些编译器有像 _forceinline 这样的东西,它会强制一个函数被内联。这并不总是可能的(想想递归函数)
  • 好吧,安德烈,谢谢,但问题不在于使用内联。此外,内联函数在链接程序中被它们各自的代码替换,我们无法内联读取它们(它们在高级语言中不是内联的)。正如@jerry 所说的那样,我想扁平化代码。
猜你喜欢
  • 2018-05-19
  • 2017-07-04
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 2016-03-26
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多