'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
上的 ;
使它成为一个空循环(什么都不做),因此您的代码不会执行您期望的操作。
我试图构建一个已定义的宏函数来将元素搜索到选项卡中,但编译器 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
上的 ;
使它成为一个空循环(什么都不做),因此您的代码不会执行您期望的操作。