3

引数として割り当てに使用する関数が渡される関数を作成しようとしています。タイプ の有効なアロケータを受け入れる必要がありますvoid *(*)(size_t)。ただしalloca、アロケーターとして使用しようとすると、奇妙な動作が発生します。関数への関数ポインターを構築すると、正常にallocaコンパイルされますが、リンカー エラーが発生します。

#include <stdlib.h>
#include <alloca.h>

int main() {
  void *(*foo)(size_t) = alloca;
}

結果は

/tmp/cc8F67yC.o: In function `main':
test15.c:(.text+0x8): undefined reference to `alloca'
collect2: error: ld returned 1 exit status

これは alloca がインライン化されていることと関係がありますか? しかし、インライン化は、関数がアドレスを持つ必要がない場合の最適化としてのみ行われるわけではありません。実際、GCC を使用すると、上記のコードで期待どおりに動作する独自のバージョンを作成することもできます。

static inline void *alloca(size_t n) {
  return __builtin_alloca(n);
}

標準バージョンが同じように動作しない理由はありますか?

4

3 に答える 3