'Expected expression' C 中的宏复合表达式错误

'Expected expression' error in macro-compound-expression in C

我试图构建一个已定义的宏函数来将元素搜索到选项卡中,但编译器 return 出现错误:

test2.c:27:11: error: expected expression
    ret = SEARCH(tab, targ);
          ^

我不明白这个错误,因为赋值语句是一个表达式。

这是受 GNU 编译器文档中的示例代码 givne 的启发:https://gcc.gnu.org/onlinedocs/gcc/Local-Labels.html#Local-Labels

#include <stdio.h>
#include <stdlib.h>

#define NUM_EL 10
#define TAB_SIZE = NUM_EL -1

#define SEARCH(array, target)                       \
 ({                                                 \
    __label__ found;                                \
    typeof (target) _SEARCH_target = (target);      \
    typeof (*(array)) *_SEARCH_array = (array);     \
    int i;                                          \
    int value;                                      \
    for(i = 0; i <= TAB_SIZE; i++);                 \
        if (_SEARCH_array[i] == _SEARCH_target)     \
            { value = i; goto found;}               \
    value= -1;                                      \
    found:                                          \
        value;                                      \
 })

int main() {
    int tab[NUM_EL] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int ret = 0, targ = 5;

    printf("Exemple test!\n");
    ret = SEARCH(tab, targ);
} 

编辑已解决: 这是更正并正常工作的代码

#include <stdio.h>
#include <stdlib.h>

#define NUM_EL      10
#define TAB_SIZE    NUM_EL - 1

#define SEARCH(array, target)                       \
 ({                                                 \
    __label__ found;                                \
    typeof (target) _SEARCH_target = (target);      \
    typeof (*(array)) *_SEARCH_array = (array);     \
    int i;                                          \
    int value;                                      \
    for(i = 0; i <= TAB_SIZE; i++)                  \
        if (_SEARCH_array[i] == _SEARCH_target)     \
            { value = i; goto found;}               \
    value= -1;                                      \
    found:                                          \
        value;                                      \
 })

int main() {
    int tab[NUM_EL] = {10, 52, 98, 45, 12, 31, 15, 1, -74, -10};
    int targ = 52;

    printf("Exemple test!\n");

    int res = SEARCH(tab, targ);
    res != -1 ? \
    printf("tab[%d] --> %d\n", res, targ) : \
    printf("%d Not found!\n",targ);
} 

TL:DR:在完全理解基本的 C 语法之前,不要尝试处理复杂的宏。

问题出在您的宏

#define TAB_SIZE = NUM_EL - 1

这使得 TAB_SIZE 扩展为令牌序列 = NUM_EL -1。因此,在您的 SEARCH 宏中,您最终得到

for (i = 0; i <= = NUM_EL - 1; i++);

另请注意,for 上的 ; 使它成为一个空循环(什么都不做),因此您的代码不会执行您期望的操作。