忘れたときに備えた記録

トップ «前の日記(2009-05-08(Friday)) 最新 次の日記(2009-10-17(Saturday))» 編集
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2009-06-08(Monday)

ひどい名前

#include <math.h>

double y0;

int main()
{
    return 0;
}

このソースをコンパイルすると

test.c:3: error: ‘y0’ redeclared as different kind of symbol

というエラーが出てしまいます(Ubuntu 9.04と、少し古めのFedoraで確認)。

で、この原因はと言うと、math.hの中でincludeされているファイルに bits/mathcalls.h というものがあるのですが、そこに

__MATHCALL (j0,, (_Mdouble_));
__MATHCALL (j1,, (_Mdouble_));
__MATHCALL (jn,, (int, _Mdouble_));
__MATHCALL (y0,, (_Mdouble_));
__MATHCALL (y1,, (_Mdouble_));
__MATHCALL (yn,, (int, _Mdouble_));

という記述があるからのようです。前後のj0, j1, jn, y1, ynも軒並み、同じエラーに引っかかります。

なんじゃこりゃと思いながら、sinやcosも同じ宣言がされているので試しに

$ man j0

としてみたら

名前
       j0,  j0f,  j0l, j1, j1f, j1l, jn, jnf, jnl, y0, y0f, y0l, y1, y1f, y1l,
       yn, ynf, ynl - ベッセル関数

書式
       #include <math.h>

       double j0(double x);
       double j1(double x);
       double jn(int n, double x);
       double y0(double x);
       double y1(double x);
       double yn(int n, double x);

だそうです。

それにしても、標準ライブラリの関数名にy0とか使っちゃうのはど~なんでしょうか。

Tags: C
[]