• ベストアンサー

typeofについて

以下のマクロでtypeofの+1の意味するところははどのようなものでしょうか? #define test(val) \ ({ \ typeof((val) + 1) __tmp = (val); \ })

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

valを+1できる型に限定するため、でしょうか マクロの引数には型が無いので。 (struct等だと、+1できずにエラーになる) でも、struct,union以外の型は、ポインタ、配列も含め「+1」できるので、その程度の型を限定する効果が、このマクロにどこまで有効なのかはわかりません。 #include <stdio.h> #define test(val) \ ({ \ typeof((val) + 1) __tmp = (val); \ }) int main() { int a=1 ; double b=2; int c[10]={0} ; char d[]="string1" ; char * e="string2" ; struct {int x;} f ; test(a) ; test(b) ; test(c) ; test(d) ; test(e) ; test(f) ; // エラーになるのはここだけ return 0 ; }

v-north
質問者

お礼

なるほどです。ご指摘いただいたご回答で、改めて実際の使用例を見てみると、マクロ展開では構造体の変数のポインターとしなければならなく、そして以降の__tmpは、関数引数としてvalを渡されたように使われていました。 また、同じ処理の中で、sizeは2より大きくなくてはならない。と言う機能をマクロに持たせている以下のような感じのマクロもあって、このことも考慮すると、仰ることだと理解しました。ありがとうございました。 #define __HOGEHOGE(type, size) \ { \ type buf[((size < 2))) ? -1 : size]; \ }

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

1 を足す.

v-north
質問者

お礼

そうそうの御回答ありがとうございます。この1 を足す.と言うのが、型に対してどのような意味をもっているのかが・・・。

関連するQ&A

  • [C/C++]プリプロセッサのファイル読み込み

    #defineで定数を設定する場合に、TXTなどのファイルを読み込み、読み込んだ 値を定数として設定することは可能でしょうか? 下記のようなプログラムを考えていたのですが、うまくいかなくて悩んでいます。 ご教授お願いします。 #define VARIABLE '0' #define TMP fgetc(fopen("./test.txt","r+")) #undef VARIABLE #if TMP=='a'   #define VARIABLE 'a' #elif TMP=='b'   #define VARIABLE 'b' #else   #define VARIABLE 'c' #endif

  • c#のマクロ定義について

    C言語でマクロ定義の場合以下のようにヘッダファイルに#defineで定義しますが、C#の場合どのようにすればいいのでしょうか。 C言語の場合 *** test.h *** #define TEST 5 C#の場合 public const int TEST = 5; //これでいいの? 専用のclassを用意するの? 初歩的な質問ですが宜しくお願い致します。

  • このCGIサブルーチンを解説してください。

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=393199 の続きのようなかんじですが…。 下記のコードがわかりません。 おわかりになるかた解説してください。 sub setCookie{ local($tmp, $val); $val = $_[1]; $val =~ s/(\W)/sprintf("%%%02X", unpack("C",$1))/eg; $tmp = "Set-Cookie:"; $tmp . = "$_[0]=$val;"; $tmp . = "expires=Thu, 1-Jan-2030 00:00:00 GMT\n"; return($tmp); } 1行目:サブルーチン名 2行目:$tmp,$valをそれぞれローカル変数に設定。 3行目:? 4行目:$valを16進数から1バイトずつ変換? 5行目:$tmpに"Set-Cookie:"を代入。 6行目:$tmp.に"$_[0]=$val;"を代入。 7行目:$tmp.に"expires=Thu, 1-Jan-2030 00:00:00 GMT\n"を代入。 8行目:? というところまではなんとか解釈したのですが、「?」の部分がわかりません。 Set-Cookieヘッダを作成しているらしいのですが…。

    • ベストアンサー
    • CGI
  • STLを使わずに可変長配列を再現する方法

    STLのlistが(配列に比べると)想像以上に遅かったので C++で可変長配列を再現したいのですけども 配列の拡張が思った以上に遅く困っています。 毎回newではオーバーヘッドが発生しますので、 現在は配列を一定数確保しておき 足りなくなったら配列を拡張(再確保)しています。 現在の配列のアドレスを一旦退避させてdeleteし、 新たにnewで生成して復帰させるといった感じです。 ただしこれでは、配列の要素数が増えるほど遅くなり、 オブジェクトの参照ならまだしも実体の場合は 全てコピーしなければならないので、 場合によってはSTLのlistよりも遅くなってしまいます。 newで生成してるのでできればreallocは使わずに 再現したいのですが、どうにか方法は無いでしょうか? よろしくおねがいします。 //----------------------------------------------- struct Test {   int val;   Test( int _val ){ val=_val; } }; Test obj1( 1 ); Test obj2( 2 ); Test obj3( 3 ); // 元のデータに代入 Test **ptr = new Test*[2]; ptr[0] = &obj1; ptr[1] = &obj2; // 退避させる Test **tmp = new Test*[2]; for( int i=0; i<2; i++ ) tmp[i] = ptr[i]; // 拡張する delete [] ptr; ptr = new Test*[4]; // 復帰させる for( int i=0; i<2; i++ ) ptr[i] = tmp[i]; delete [] tmp; ptr[2] = &obj3; //----------------------------------------------- ※NULLチェックなどはここでは省いています。

  • gccのインラインアセンブラ

    コンパイラはgccで、コンパイルオプションでintel形式でコンパイルしています。 shl命令で左シフトしたいのですが、初期値0xfffffffなのに実行結果は0xffdf0000になってしまいます。 コード: asm(" shl %0, 4 " : "=r" (val)) #defineでマクロにしています(valは引数です)。 どうすれば結果が0xfffffff0になりますか。

  • 配列をstrtokする方法

    いつもお世話になってます。 標題についてやり方を教えて頂けないでしょうか。 要件としては文字列["test1|on+test2|off"]を 1回目は + で分割し、二回目は | で分割した配列作りたいです。 自分の書いたコードはですが、当たってるががわかりません。 typedef struct test{ hoge[200]; } test_1 test_1.= "test1|on+test2|off"; test_ary[200]; tmp_ary[200]; ret_key[]; ret_val; *p; strcpy(test_ary, test_1); // 一回目 p = strtok(test_ary, "+"); tmp_ary[0] = *p; int i = 1; do{ p = strtok(NULL, "+"); tmp_ary[i] = *p; i++; } while(p); // 二回目 for (i=0; i<sizeof(tmp_ary); i++){ p = strtok(tmp_ary[i] , "|"); ret_key[i] = *p; p = strtok(NULL, "|"); ret_val[i] = *p; } これで作ってコンパイルはエラーになりませんでした。 又別件で、 上記ret_keyで作成したキーを元に、 構造体のメンバーがあるか検索することは可能でしょうか。 ご存知だったらご教授願いたいです。 以上、宜しくお願いいます。

  • EXCELのマクロについて

    以下のプロシージャの内容が理解出来ません。 Public Sub test() test.show End Sub Public Function te2(ByVal Val1 As Single, Typ As String) As list シート1の名前.Activate draht=test.suchtest(Val1,Typ) End Function 不明点は以下の通りです。 ・「show」は何の操作か?(関数でしょうか?) ・また、「test」とは何を指すものか?  プロジェクト中には上記ステートメント以外で「test」の記載は  有りません。また、シート名ではなく、セル範囲の名前でも無い  ようです。何か他のものでしょうか? ・As list のlistとは何か?  関数のデータ型を記載する場所にユーザが付けたと思われる名前を記 載して何故マクロが動くのか? ・draht=test.suchtest(Val1,Typ)は何が異なるのか?

  • 解説をお願いします。

    #define ast_test_flag(p,flag) ({ \ typeof ((p)->flags) __p = (p)->flags; \ typeof (__unsigned_int_flags_dummy) __x = 0; \ (void) (&__p == &__x); \ ((p)->flags & (flag)); \ }) あるソースコードを読んでいると上のような記述に当たりました。 何をしているのか解説していただけませんか。 __xとか¥記号とか宣言していないものも多く、皆目見当がつきません。

  • powershell)ファイル内変数名を変換したい

    powershellです。 変数に例えば以下の変数が設定されているとします。 ${VAL1}="aaa" ${VAL2}="bbb" test.txtというファイルに以下が記載されているとします。 ${VAL1} ${VAL2} test.txtというファイルを読み込んだ際に、 ${VAL1}を"aaa"、${VAL2}を"bbb"と読み替えて読み込む方法はありますか。 変数のパターンは事前に分からないので、 '${VAL1}'を"aaa"に置換する、とかの方法はなしです。 Invoke-Expressionを使えばうまくいくかと思い、 以下のように書いてみましたが、 Invoke-Expressionのコメントをはずすとエラーになります。 --------- ${VAL1}="aaa" ${VAL2}="bbb" ${SR} = New-Object System.IO.StreamReader( "Y:\test.txt", [Text.Encoding]::GetEncoding("Shift_Jis")) while ((${LINE} = ${SR}.ReadLine()) -ne ${null}){ #Invoke-Expression "${LINE_VAL}=${LINE}" Write-Output ${LINE} #Write-Output ${LINE_VAL} } ${SR}.close --------- 何か分かる方教えてください。

  • 変数に格納された文字列でdefineの値を呼びたい

    以下の内容で"Hello world!"を表示したい場合 どのように記述すれば良いのでしょうか。 define("DEF_TEXT", "Hello world!"); $def_array = Array('URL','TEXT','MAIL'); $def_val = 'DEF_' . $def_array[1]; // 'DEF_TEXT'; $value = (ここがわからない); echo $value; $$def_val、${$def_val}、eval($def_val) と書いてみましたがどれもダメでした。

    • ベストアンサー
    • PHP