让 gcc 内联并导出一个函数

Let gcc inline AND export a function

鉴于性能原因需要内联的函数(因为它是在循环中调用的,我不希望调用开销)。简化示例:

void increment(int *single_value) {
  *single_value++;
}

void increment_values(int *array, size_t length) {
  for(size_t i=0;i<length;i++) {
    increment(&A[i]);
  }
}

但是我想对函数进行单元测试,例如

void test_increment() {
  int value = 5;
  increment(&value);
  assert_equal(value, 6);
}

是否可以告诉编译器内联函数 以导出它,这样我就可以 link 反对我的测试?我正在使用 gcc,但是适用于所有编译器的方法(clangicc、...)将是首选。

使用 inline 只是暗示编译器可能会随意内联:

"[ . . . ] An inline definition does not provide an external definition for the function, and does not forbid an external definition in another translation unit. An inline definition provides an alternative to an external definition, which a translator may use to implement any call to the function in the same translation unit. It is unspecified whether a call to the function uses the inline definition or the external definition."

— ISO 9899:1999(E),C99 标准,第 6.7.4 节

事实上,许多编译器在使用优化标志调用时自动对看起来像您的示例的函数执行此操作。此外,编译器通常比您更了解它正在生成什么样的指令代码,因此不一定要告诉它内联。

在你的情况下,我只是让编译器决定,根本不使用内联。但是,如果您选择使用 inline,您仍然可以在单元测试中使用该功能,所以完全没有问题。