Как правильно определять и использовать параметры в макросах C? - PullRequest
1 голос
/ 17 июня 2020

Я хочу использовать макрос basi c в C для доступа к определенному Bit b в char-Array (* char) 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 нужно еще несколько скобок.

1 Ответ

2 голосов
/ 17 июня 2020

Пробел после TstBit кажется здесь проблемой. Препроцессор, в отличие от компилятора C, немного более требователен к пробелам.

В вашем макросе препроцессор заменяет все вхождения TstBit на (Arr,b), что является не ваше намерение.

#define TstBit(Arr,b) ( Arr[b/8] & (1 << (b%8)) )

должно работать так, как вы хотите.

EDIT: Также обратите внимание, что существует проблема с тем, как вы пытаетесь использовать это макрос, как указано в этом комментарии !

Аргументы макроса в идеале не должны иметь побочных эффектов. Если они это сделают, вы должны позаботиться о том, чтобы они не привели к неопределенному или непреднамеренному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...