3

エラーのヘルプが必要です: '{' トークンの前に識別子または '(' が必要です。メイン ファイルとソート ヒープ ファイルがあります。この 3 つのファイルはすべて別個のものであり、ターミナルでこのファイルを実行しようとしています。コマンド ライン端末でこのファイルを実行するために使用するのは次のとおりです。

gcc -std=c99 -DRAND -DHEAP -DTYPE=double -DPRINT main.c srtheap.c

これは私のコードです:

/*
 *
 *  srt.h file
 *
 */

#ifndef SRT_H  
#define SRT_H  
#include < string.h >  
#define MAX_BUF 256

#define swap(qx,qy,sz) 

{                                             
  do                                                                 
   char buf[MAX_BUF];                                              
   char *q1 = qx;                                                  
   char *q2 = qy;                                                  
   for (size_t m, ms = sz; ms > 0; ms -= m, q1 += m, q2 += m) {    
       m = ms < sizeof(buf) ? ms : sizeof(buf);                    
       memcpy(buf, q1, m);                                         
       memcpy(q1, q2, m);                                          
       memcpy(q2, buf, m);                                         

  while (0)
}

void srtbubb(void *, size_t, size_t, int (*)(const void *, const void *));  
void srtheap(void *, size_t, size_t, int (*)(const void *, const void *));  
void srtinsr(void *, size_t, size_t, int (*)(const void *, const void *));  
void srtmerg(void *, size_t, size_t, int (*)(const void *, const void *));  

#endif /* SRT_H */
4

4 に答える 4

6

あなたの do-while ループには、中かっこに関する不適切な構文があります (do-while のペアと for ループのペアが必要です。また、 の後にセミコロンがありません。また、複数行マクロwhileの for が必要です。これを試してください:\

#define swap(qx,qy,sz)                                              \
do                                                                  \
{                                                                   \ 
   char buf[MAX_BUF];                                               \
   char *q1 = qx;                                                   \ 
   char *q2 = qy;                                                   \ 
   for (size_t m, ms = sz; ms > 0; ms -= m, q1 += m, q2 += m) {     \
       m = ms < sizeof(buf) ? ms : sizeof(buf);                     \
       memcpy(buf, q1, m);                                          \
       memcpy(q1, q2, m);                                           \
       memcpy(q2, buf, m);                                          \
   }                                                                \
} while (0)
于 2013-06-27T14:39:03.370 に答える
6

複数行マクロの#defineでは、各行 (最後の行を除く) を で終了する必要があります\。したがって、次のようになります。

#define swap(qx,qy,sz)                                              \
do {                                                                \
    char buf[MAX_BUF];                                              \
    char *q1 = qx;                                                  \
    char *q2 = qy;                                                  \
    for (size_t m, ms = sz; ms > 0; ms -= m, q1 += m, q2 += m) {    \
        m = ms < sizeof(buf) ? ms : sizeof(buf);                    \
        memcpy(buf, q1, m);                                         \
        memcpy(q1, q2, m);                                          \
        memcpy(q2, buf, m);                                         \
    }                                                               \
} while (0)

の後に空白を入れないように十分注意してください。空白を入れる\と がキャンセルされ\、複数行の が壊れて、#define見つけにくいコンパイラ エラーが発生するからです。

于 2013-06-27T14:40:56.050 に答える
1

#defineingにはいくつかの間違い/タイプミスがありますswap():

これでうまくいくはずです(少なくともコンパイル):

#define swap(qx,qy,sz) \
  do { \ 
    char buf[MAX_BUF]; \
    char *q1 = (qx); \
    char *q2 = (qy); \
    for (size_t m, ms = (sz); ms > 0; ms -= m, q1 += m, q2 += m) \
    { \
      m = ms < sizeof(buf) ? ms : sizeof(buf); \
      memcpy(buf, q1, m); \
      memcpy(q1, q2, m); \
      memcpy(q2, buf, m); \
    } \
  } while (0) 

定義には改行がない場合があるため\、プリプロセッサに行を結合するように指示するために使用されることに注意してください。

()また、マクロ展開後の望ましくない副作用を避けるために、マクロの引数を使用時に入れることをお勧めします。

于 2013-06-27T14:44:46.507 に答える