>それは定義済みかどうかではなく、「"@@"で始まっていないのでクラス変数と
>して正しい名前ではない」というエラーです。

なるほど、諒解しました。

どうして錯覚してしまったのか振り返ってみると、rb_cvar_set() を
使うならば「@@」なしの変数も定義でき、Cで実装したメソッド内では
参照も可能なので、そういうものと思い込んでしまったようです。
さらに、リファレンス・マニュアルの「C API」に「変数がまだ定義されていない
場合は NameError を発生します」と書いてある (実際には発生しない) のも
誤解のもとでした。

	rb_cvar_set(klass, rb_intern("@@tt_cvar"), INT2NUM(28));
	rb_cvar_set(klass, rb_intern("tt_cvar"), INT2NUM(14));

	val = rb_cvar_get(klass, rb_intern("tt_cvar"));
	printf("val = %d\n", NUM2INT(val));	/* ==> val = 14 */

	val = rb_cvar_get(klass, rb_intern("@@tt_cvar"));
	printf("val = %d\n", NUM2INT(val));	/* ==> val = 28 */

	val = rb_cv_get(klass, "@@tt_cvar");
	printf("val = %d\n", NUM2INT(val));	/* ==> val = 28 */


--
tac / amris.co.jp
横山岳浩