(宏创建)C中的语法错误

时间:2018-03-27 17:29:30

标签: c syntax macros

我已经为分配创建了宏,但找不到运行程序时遇到的语法错误。非常感谢任何想法,谢谢。

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

#define ODD(X) ((X) & 01)
#define BITON(X,N) (((X) >> N) & 01)
#define ALLON(X,S,E) (((X) & ((((int) pow(2,(E-S))-1) << (E-S))) ^ (((int) pow(2,E-S)-1) << (E-S)))
//-----------------------------------------------------------------------------                                          
int main(void) {

  unsigned int U1,BitNumber,Start,End;

  printf("Enter an integer : ");
  scanf("%ud",&U1);
  printf("%u is %s\n",U1,ODD(U1)?"odd":"even");

  printf("Enter an integer and a bit number : ");
  scanf("%u %d",&U1,&BitNumber);
  printf("%u has bit %d %s\n",U1,BitNumber,BITON(U1,BitNumber)?"on":"off");

  printf("Enter an integer, start and end bit numbers : ");
  scanf("%u %u %u",&U1,&Start,&End);
  printf("%u has %s those bits on\n",U1,ALLON(U1,Start,End)?"all":"not all");

  return(EXIT_SUCCESS);
}

//----------------------------------------------------------------------------- 

错误:

BitOps.c: In function ‘main’:
BitOps.c:23:77: error: expected ‘)’ before ‘;’ token
   printf("%u has %s those bits on\n",U1,ALLON(U1,Start,End)?"all":"not all");
                                                                             ^
BitOps.c:26:1: error: expected ‘;’ before ‘}’ token
 }

2 个答案:

答案 0 :(得分:1)

ALLON的宏定义中有一个额外的左括号。编译器在使用ALLON的行末尾到达分号之前不能确定它是错的,因此错误消息会抱怨该行(这很好)而不是{{{{}}的定义。 1}},但ALLON的定义是问题所在。

答案 1 :(得分:0)

启用-Wall标志并编译代码,其内容非常丰富,不要忽略它。

代码中的错误很少
  • 更好01替换为实际目的的0x1
  • 阅读警告,BitNumber声明为unsigned,但使用%d格式说明符。使用-Wall标志编译代码。
  • ALLON()宏扩展不正确,我在下面正确添加。

预计会有一个

#define ODD(X) ((X) & 0x1)
#define BITON(X,N) (((X) >> N) & 0x1)
#define ALLON(X,S,E) (((X) & ( ((((int) pow(2,(E-S))-1) << (E-S))) ^ (((int) pow(2,E-S)-1) << (E-S)))) )

int main(void) {

  unsigned int U1,BitNumber,Start,End;

  printf("Enter an integer : ");
  scanf("%u",&U1);
  printf("%u is %s\n",U1,ODD(U1)?"odd":"even");

  printf("Enter an integer and a bit number : ");
  scanf("%u %u",&U1,&BitNumber);
  printf("%u has bit %d %s\n",U1,BitNumber,BITON(U1,BitNumber)?"on":"off");

  printf("Enter an integer, start and end bit numbers : ");
  scanf("%u %u %u",&U1,&Start,&End);
  printf("%u has %s those bits on\n",U1,ALLON(U1,Start,End) ?"all":"not all");

  return(EXIT_SUCCESS);
}