发现错误:
网上复制的组播代码,略有问题,无头文件,服务端宏定义处发现多了个“;”——顺手删了,没关心宏定义,主要是添加头文件,编译成功。
当时以为只是画蛇添足,删不删就是个习惯,对结果影响不大,没想到会是错误源头。
到了客户端,出现了编译错误。
expected ‘)’ before ‘;’ token
编译不通过,以为是圆角和字符编码的问题,因为代码是直接复制进虚拟机的并且服务端出现一些‘stray’错误。查找并重写了25行上下很多句,没解决问题。
看代码的时候基本上前十行已经不在屏幕范围内,看不到,提示也没在那,也没去想。
注释了一些部分,逐渐排除,无果。
求助,高手也是注释排查,不过我是向下排查(因为提示的行数在下边),他是向上排查,最后确定是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);
八卦:其实编译器也可以改进改进嘛,不要提示我出事的那行,提示一下根源,也就是宏定义