【问题标题】:Compile-Time Function Execution编译时函数执行
【发布时间】:2016-07-24 22:41:09
【问题描述】:

有没有办法在 C 中执行compile-time function execution?与海合会?我只看到使用constexpr in C++ 提供此功能。

【问题讨论】:

  • 根据代码,编译器可能会将其优化为一个简单的值,但在 C 中没有标准的方法。

标签: c gcc compile-time


【解决方案1】:

只要表达式中只涉及常量,它将在编译时计算。 C++ constexpr 主要是一种不涉及宏的类型安全方式。在 C 中,只有宏。例如:

#define CIRCLE_AREA(r) (int32_t)( (double)(r) * (double)(r) * M_PI )

int32_t area = CIRCLE_AREA(5);

在编译时执行所有计算,所以相当于写:

int32_t area = 78;

【讨论】:

  • static inline int32_t circle_area(double r) { return r * r * M_PI; }?
  • @JonathanLeffler 我相信这可能会迫使计算在运行时完成。
  • 用常量字符串可以吗?
  • GCC 5.3.0 在 Mac OS X 10.11.4 上。来源:int main(void) { int32_t area1 = CIRCLE_AREA(5); int32_t area2 = circle_area(5); printf("%d vs %d\n", area1, area2); return 0; } — 汇编器输出(最相关位):movl $78, %edx - movl $78, %esi - leaq LC0(%rip), %rdi - xorl %eax, %eax - call _printf - 在我看来,函数和宏都被扩展为 78编译器。
  • @Lundin 在 as-if 规则下,任何不依赖于外部输入的事情都可以在编译时完成。此外,该标准不要求您的代码在编译时发生。我们真的在讨论常见编译器的预期行为。
猜你喜欢
  • 1970-01-01
  • 2016-11-11
  • 2014-11-05
  • 2016-06-28
  • 2016-05-21
  • 2013-09-07
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多