C/C++编程日常踩到的那些坑。。。
目录
0. 前言
1. error: invalid operands of types ‘__gnu_cxx::__enable_if
2. Linux下将make输出的信息定向输出到文件中
3. warning C4819
0. 前言
记录日常踩到的一些坑,给以后的自己参考。
或者也能够给偶尔路过的伙伴一些参考那就荣幸之至了。
1. error: invalid operands of types ‘__gnu_cxx::__enable_if
报错信息:error: invalid operands of types ‘__gnu_cxx::__enable_if
编译器版本信息(Centos7_64):

定位到的问题代码,更具体一些是调用该宏处传入的x不是整型的数:
#define SIGNED_SHIFT(x,bit) ((x>0)?(abs(x)>>bit) :-1*(abs(x)>>bit))
网上逛了一圈:
有说因为用了
有说改为“#include
stackoverflow的一个帖子对此进行了详尽的讨论:c++ - G++ abs() on a short int appears to turn it into a double? - Stack Overflow
其中的高赞解答如下所示:
abs()is not a template, but a set of overload functions. According to the standard, the overload forint,long,float,double,long doubleshould exist. But the overload forshortdoes not exist. But as the conversion sequence fromshorttointis only a promotion, and the conversion sequence formshortto the other overloaded types are all conversions, the overload forintshould be selected....
Explicitly casting it to
int(std::abs((int)i);) should solve this problem.
据此,将式中x全部做显式的类型转换(如下所示) ,修改后编译通过。
#define SIGNED_SHIFT(x,bit) (((int)x>0)?(abs((int)x)>>bit) :-1*(abs((int)x)>>bit))
教训:少想当然,尽量做显式的类型转换。
2. Linux下将make输出的信息定向输出到文件中
当编译报告大量信息刷屏时,要从中分辨信息是一件痛苦的事情。如果能将信息输出文件中要搜索(比如说error)起来就比较方便了。
第一感是“make *** > build.log”,然而,行不通。只将make执行的命令信息输出到指定文件中,没有把报错信息等输出到文件中。折腾了很久痛感技到用时方恨少,终于在以下博客中找到了答案:将Linux下编译的warning警告信息输出到文件中。要点摘录如下:
数字 含义 标准叫法
0 标准输入 stdin = standard input
1 标准输出 stdout = standard output
2 标准错误输出 stderr = standard error
而系统默认的stdin,stdout,stderr,都是屏幕,所以,当你执行命令,比如make,后,所输出的信息,都是可以在屏幕上看到的 。所以,想要将对应信息输出到某个文件中,就用对应的数字加上重定向符号'>',实现将这些信息,重新定向到对应的文件中,即可。(上面这两句,也是之前太多的人来解释,但是没有说明白的地方。)下面以make命令为例来说明,如何把对应的信息,输出到对应的文件中:
【用法】
- 1.想要把make输出的全部信息,输出到某个文件中,最常见的办法就是:
make xxx > build_output.txt
此时默认情况是没有改变2=stderr的输出方式,还是屏幕,所以,如果有错误信息,还是可以在屏幕上看到的。
- 2.只需要把make输出中的错误(及警告)信息输出到文件中ing,可以用:
make xxx 2> build_output.txt
相应地,由于1=stdout没有变,还是屏幕,所以,那些命令执行时候输出的正常信息,还是会输出到屏幕上,你还是可以在屏幕上看到的。
- 3.只需要把make输出中的正常(非错误,非警告)的信息输出到文件中,可以用:
make xxx 1> build_output.txt
相应地,由于2=stderr没有变,还是屏幕,所以,那些命令执行时候输出的错误信息,还是会输出到屏幕上,你还是可以在屏幕上看到的。
- 4.想要把正常输出信息和错误信息输出到分别的文件中,可以用:
make xxx 1> build_output_normal.txt 2>build_output_error.txt
即联合使用了1和2,正常信息和错误信息,都输出到对应文件中了。
- 5. 所有的信息都输出到同一个文件中:
make xxx > build_output_all.txt 2>&1
其中的2>&1表示错误信息输出到&1中,而&1,指的是前面的那个文件:build_output_all.txt 。注意:上面所有的1,2等数字,后面紧跟着大于号'>' ,中间不能有空格
- 6. “5”的改进版:
make xxx 2>&1 | tee build_output_all.txt
唯一的区别就是,stdout和stderr被导入文件的同时,还可以看到屏幕输出。
3. warning C4819
VS项目碰到如下警告: warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失虽然不影响程序的正常运行,但是天天看着它也很让烦人。网上的方法很多是如下4种:
(1)转换Code文件为Unicode格式;
(2)在Project -> Properties -> Configuration Properties -> C/C++ -> Advance 的 Disable Specific Warnings 中添加相应的警告编号:4819;
(3)或找出不符合Unicode格式的文件,然后在该文件的开始处加入下面的语句:
# pragma warning (disable:4819)
(4)哪个文件出现这个警告错误,打开它, 用VS2010的查找替换功能,打开允许正则表达式选项,选择当前窗口,查找替换 \n 为 \n , 然后,这个世界就清净了。原因: 查找的 \n 是跨平台的回车,替换的 \n 却是当前代码页的回车了。
用第(2)种方法解决掉了目前的问题:

有关格式的问题还有待调查。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
