組み込みC/C++

C/C++リテラシー向上のためのページ

C言語アドレス(ラべリング)の不備

C言語ではコンパイラがコンパイルの際にリンカが検索できるようにグローバル関数の名前を変えます。void a_func(void) とあったらオブジェクト(アセンブリ)では _a_funcのように接頭に_(アンダーバー)が付帯されて表現されます。ここに引数の情報がない事である問題が発生します。

 

main_routin.c

#include <stdio.h>
extern void a_func(int a);
void main(void){
     a_func(5);
}

 

sub_routin.c

#include <stdio.h>
void a_func(int a, int b);
void a_func(int a, int b){
      printf("b=%d\n", b);
}

 

引数の数が呼び出し元と呼び出し先で異なっているにも関わらずビルドが通ってしまいます。

(僕が確認したところではVisualStudioとHEWで通ってしまう。)

そして恐ろしい事に不定な値を吐き出してしまいます。

 

リンカはこの間違いを教えてくれはしないので、やはりプロトタイプ宣言はヘッダに記載してインクルードするのが良い方法かと思います。

もしくはC++であればマングル処理を行い引数情報をラべリングしてくれるので、ベターCとしてC++にしてしまうのが良い対処方法ではないでしょうか。