给定一个由于性能原因需要内联的函数(因为它是在循环中调用的,我不想要调用开销)。简化示例:
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);
}
是否可以告诉编译器内联函数并导出它,这样我就可以链接到我的测试?我使用的是gcc
,但最好使用适用于所有编译器(clang
、icc
…)的方法。
使用inline
只是一个提示,编译器可能会随意内联:
"[…]内联定义不为函数提供外部定义,也不禁止外部另一个翻译单元中的定义。内联定义提供译者可以使用的外部定义的替代方案以在同一翻译单元中实现对该函数的任何调用。它未指定对函数的调用是否使用内联定义或外部定义。"
--ISO 9899:1999(E),C99标准,第6.7.4节
事实上,当使用优化标志调用时,许多编译器会自动对看起来像您的示例的函数执行此操作。此外,编译器通常比你更清楚它正在生成什么样的指令代码,所以不一定要告诉它内联。
在您的情况下,我只是让编译器来决定,而根本不使用内联。但是,如果您选择使用inline
,您仍然可以在单元测试中使用该函数,因此完全没有问题。