宏定义错误导致编译出错——期待括号

 

 发现错误:

网上复制的组播代码,略有问题,无头文件,服务端宏定义处发现多了个“;”——顺手删了,没关心宏定义,主要是添加头文件,编译成功。

当时以为只是画蛇添足,删不删就是个习惯,对结果影响不大,没想到会是错误源头。

 

 

到了客户端,出现了编译错误。

 

expected ‘)’ before ‘;’ token

 

编译不通过,以为是圆角和字符编码的问题,因为代码是直接复制进虚拟机的并且服务端出现一些‘stray’错误。查找并重写了25行上下很多句,没解决问题。

 

看代码的时候基本上前十行已经不在屏幕范围内,看不到,提示也没在那,也没去想。

注释了一些部分,逐渐排除,无果。

宏定义错误导致编译出错——期待括号_第1张图片



求助,高手也是注释排查,不过我是向下排查(因为提示的行数在下边),他是向上排查,最后确定是htons(MCAST_PORT)那一行的问题。高手询问宏在哪定义的,还真没留意宏的事,“这种小事~~~”。上翻,发现宏定义出问题——#define MCAST_PORT 8888;


解析:

只是多了个“;”

但是结合起来就出了问题。

 

local_addr.sin_port = htons(MCAST_PORT);

变成了

local_addr.sin_port = htons(8888;);

 

拆解开来估计是

local_addr.sin_port = htons(8888;

);

所以先找右括号”)”,出现错误提示。



总之,删除分号,问题解决。

#define MCAST_PORT 8888



 

 =======================================================================================================================

PS:

找不出错误,跟看不到列号也有关系:

Ubuntu暂时找到的能行的办法就是ctrl+g,走到哪按一下就显示哪,略麻烦,不过有效。

除非某些系统支持其他功能,或者插件。



另:宏定义是简单的文本替换,宏定义后边跟分号,性质不同于C程序代码里跟分号,程序代码跟分号,等于空语句,宏定义跟分号,分号同样要在预处理时替换过去。

 关于宏定义中符号的其他尝试:

既然8888和“;”“粘连绑定”起来了,肯定无法从C语句补充右括号

local_addr.sin_port = htons(8888;

从宏定义补充呢?

做个测试,意图补偿右括号,让其期待左括号。。

#define MCAST_PORT 8888);

期待右括号

#define MCAST_PORT 8888);(

全都期待右括号~!


奇怪,可能宏定义有些不替代,时间关系略过,待研究。。。。。。。。。。。


关于宏定义的各种符号的问题,想起另一个知识点——do{…}while(0);



八卦:其实编译器也可以改进改进嘛,不要提示我出事的那行,提示一下根源,也就是宏定义

 

 

 

你可能感兴趣的:(宏定义错误导致编译出错——期待括号)