• ベストアンサー

記述の意味がわからないdefine文

今、H8S2368というマイコンでOSをのせたプログラムに関して勉強中で、OSで動かすタスクの作り方をやっているのですが、どうやらプログラムを見てみると、 CAEATE_TASK(Net ,TASK_NET_STK_SIZE ,TASK_NET_PRIORITY,0x00/*OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR*/); この関数を実行することでタスクが作成されるようなのですが、 この”CAEATE_TASK”という関数を全ソースに検索してみたところ #define CAEATE_TASK(task,stack_size,prio,opt) \ strcpy(TaskUserData[id##task].TaskName, "##task");\ TaskUserData[id##task].TaskPrio = prio;\ OSTaskCreateExt(Task##task, (void *)0, &StackTask##task[stack_size-1], prio,\ id##task, &StackTask##task[ このように記述されていました。ちょっと今までのdefine文では見たことが無い記述がいっぱいあるのですが、これはどのような意味なのでしょうか?

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

#2です。 "##task"は"Net"にはなりません。 マクロ仮引数taskに対応する実引数がNetの場合、これを"Net"に展開するには、"##task"ではなく#taskとする必要があります。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

基本的にはすでに回答が出ているとおりです。 ただ、 "##task"という部分だけは、このマクロ定義のバグか、処理系にバグがあるための対策か、そのどちらかだと思います。

techhouse
質問者

お礼

回答頂きありがとうございました。​http://wisdom.sakura.ne.jp/programming/c/c42.html​​ このサイトを紹介して頂きありがとうございます。 見てみたところ、”トークン連結演算子”というのに該当するようですね。それで、今回質問に出した CAEATE_TASK(Net ,TASK_NET_STK_SIZE ,TASK_NET_PRIORITY,0x00/*OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR*/); #define CAEATE_TASK(task,stack_size,prio,opt) \ strcpy(TaskUserData[id##task].TaskName, "##task");\ TaskUserData[id##task].TaskPrio = prio;\ OSTaskCreateExt(Task##task, (void *)0, &StackTask##task[stack_size-1], prio,\ id##task, &StackTask##task[0], stack_size, &TaskUserData[id##task], opt); これがどのように読み変えられているのかを確認してみたところ、 #define TASK_NET_STK_SIZE 0x200 #define TASK_NET_PRIORITY 32 まずこれを踏まえておくと、結果として下記するようなことと同じということになるのでしょうか? #define CAEATE_TASK(task,0x200,32,0x00) \ strcpy(TaskUserData[idNet].TaskName, "Net");\ TaskUserData[idNet].Task32 = 32;\ OSTaskCreateExt(TaskNet, (void *)0, &StackTaskNet[0x200-1], 32,\ idNet, &StackTaskNet[0], 0x200, &TaskUserData[idNet], 0x00);

すると、全ての回答が全文表示されます。
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

id##taskのような表記は文字列連結ですね。 例えばtaskがNetのとき、id##taskはidNetになります。 # http://wisdom.sakura.ne.jp/programming/c/c42.html

techhouse
質問者

お礼

回答頂きありがとうございました。http://wisdom.sakura.ne.jp/programming/c/c42.html​ このサイトを紹介して頂きありがとうございます。 見てみたところ、”トークン連結演算子”というのに該当するようですね。それで、今回質問に出した CAEATE_TASK(Net ,TASK_NET_STK_SIZE ,TASK_NET_PRIORITY,0x00/*OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR*/); #define CAEATE_TASK(task,stack_size,prio,opt) \ strcpy(TaskUserData[id##task].TaskName, "##task");\ TaskUserData[id##task].TaskPrio = prio;\ OSTaskCreateExt(Task##task, (void *)0, &StackTask##task[stack_size-1], prio,\ id##task, &StackTask##task[0], stack_size, &TaskUserData[id##task], opt); これがどのように読み変えられているのかを確認してみたところ、 #define TASK_NET_STK_SIZE 0x200 #define TASK_NET_PRIORITY 32 まずこれを踏まえておくと、結果として下記するようなことと同じということになるのでしょうか? #define CAEATE_TASK(task,0x200,32,0x00) \ strcpy(TaskUserData[idNet].TaskName, "Net");\ TaskUserData[idNet].Task32 = 32;\ OSTaskCreateExt(TaskNet, (void *)0, &StackTaskNet[0x200-1], 32,\ idNet, &StackTaskNet[0], 0x200, &TaskUserData[idNet], 0x00);

すると、全ての回答が全文表示されます。

関連するQ&A