如何正确定义和使用 C 宏函数中的参数?
How to properly define and use parameters in C macro functions?
我想使用 C 中的基本宏来访问字符数组 (*char) 中的某个位 b Arr:
#define TstBit (Arr,b) ( Arr[b/8] & (1 << (b%8)) )
但是在这样的用法下:
int foo(const char *charArray) {
int readindex = 0;
[...]
if(TstBit(charArray,readIndex++)) {
我在带有#define-Statement 的行上收到错误:
main.c | line 7 | error: 'Arr' undeclared (first use in this function)
我怀疑我在调用函数时传递的参数不正确,或者 #define 需要更多括号。
TstBit
之后的space好像是这里的问题。与 C 编译器不同,预处理器对 spaces 有点挑剔。
对于您的宏,预处理器所做的是用 (Arr,b)
替换所有出现的 TstBit
,这不是您的意图。
#define TstBit(Arr,b) ( Arr[b/8] & (1 << (b%8)) )
应该按照你想要的方式工作。
编辑: 另请注意,您尝试使用此宏的方式存在问题,如 !
中所述
宏参数最好没有副作用。如果他们这样做,您应该注意不要导致未定义或意外的行为。
我想使用 C 中的基本宏来访问字符数组 (*char) 中的某个位 b Arr:
#define TstBit (Arr,b) ( Arr[b/8] & (1 << (b%8)) )
但是在这样的用法下:
int foo(const char *charArray) {
int readindex = 0;
[...]
if(TstBit(charArray,readIndex++)) {
我在带有#define-Statement 的行上收到错误:
main.c | line 7 | error: 'Arr' undeclared (first use in this function)
我怀疑我在调用函数时传递的参数不正确,或者 #define 需要更多括号。
TstBit
之后的space好像是这里的问题。与 C 编译器不同,预处理器对 spaces 有点挑剔。
对于您的宏,预处理器所做的是用 (Arr,b)
替换所有出现的 TstBit
,这不是您的意图。
#define TstBit(Arr,b) ( Arr[b/8] & (1 << (b%8)) )
应该按照你想要的方式工作。
编辑: 另请注意,您尝试使用此宏的方式存在问题,如
宏参数最好没有副作用。如果他们这样做,您应该注意不要导致未定义或意外的行为。