E05200029:Expected an expression. のエラーと#defineのスコープについて

E05200029:Expected an expression. のエラーについて質問があります。

使用マイコン:RX64M
開発環境:e2studio
コンパイラ:CC-RX V3.00

現在ヘッダファイルに下記のマクロ定義と、

#define NUM_BYTE 0x09
#define NUM1 0x01
#define NUM2 0x02
#define NUM3 0x03
#define NUM4 0x04
#define NUM5 0x05
#define NUM6 0x06
#define NUM7 0x07
#define NUM8 0x08
#define NUM9 0x09
ソースファイルに下記の関数を作りました。
void syori(int data, int *buf1 , int *buf2)
{
        switch (data)
        {
        case 1:
                buf1[NUM_BYTE] = {NUM1,NUM2,NUM3,NUM4,NUM5,NUM6,NUM7,NUM8,NUM9};
                buf2[NUM_BYTE] = {NUM1,NUM2,NUM3,NUM4,NUM5,NUM6,NUM7,NUM8,NUM9};
               
                break;
       
   /*~その他case文~*/
        default:
                break;
        }

}
 
この中で、配列の要素をマクロ定義した定数で初期化しようとすると、E05200029エラーで「式がありません」となります。
プログラムを書いている最中でも、「Ctrl+spaceキー」で buf1[NUM_BYTE] = {};の波かっこの中で補完機能を使おうとしても、
そこでだけは「デフォルトの候補がありません」と表示されます。
原因は分かりますでしょうか。
#defineはマクロ定義なので、スコープなどないと考えていたのですが、そのあたり自分だけの調査で限界が来たので、教えていただければと思います。
Parents
  • マクロはC言語処理系ではCコンパイラの前処理ソフトで処理されます。ファイルで一度定義されるとファイル終端まで#undefで無効化されるまで有効です。#include <ファイル名>をよく使うと思いますが、これはソースコードに#includeで指定したファイルを文字通り含んだ状態にしてしまいます。やろうと思えば#includeで.cファイルを指定しても問題ないわけです。

Reply
  • マクロはC言語処理系ではCコンパイラの前処理ソフトで処理されます。ファイルで一度定義されるとファイル終端まで#undefで無効化されるまで有効です。#include <ファイル名>をよく使うと思いますが、これはソースコードに#includeで指定したファイルを文字通り含んだ状態にしてしまいます。やろうと思えば#includeで.cファイルを指定しても問題ないわけです。

Children
  • Yamamoto様

    ご回答ありがとうございます。そもそも要素の指定ができていなかったですね。
    forループで配列をコピーするやり方に変更し、配列がコピーされているのは確認できましたが、やはり配列の代入方法が間違っていたみたいです。ご指摘の通り要素数の指定も間違いですね。
    また、case1文の中身を{}でスコープしていることについては、switch文の理解不足でした。{}でくくらなければswitch文全体にスコープされてしまいますね。
    「static const int data_table[]」とする書き方は大変勉強になりました。この書き方だと不用意に書き換えられることも防げるのでまねさせていただきます。memcpyを使うとforループでの代入に比べて、コード量が減りますね。自分のforループで代入するやり方はコード量が多く見づらいので、参考にさせていただきます。
    実際にプログラムを動かし、配列に格納されていることが確認できました。ありがとうございました。
    #defineについて今一度理解しました。