admin管理员组

文章数量:1666875

目录

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<true, double>::__type {aka double}’ and ‘int’ to binary ‘operator>>’

        编译器版本信息(Centos7_64):

        定位到的问题代码,更具体一些是调用该宏处传入的x不是整型的数:

#define SIGNED_SHIFT(x,bit)          ((x>0)?(abs(x)>>bit) :-1*(abs(x)>>bit))

        网上逛了一圈:

        有说因为用了<cmath> 就会报这个错,改为<stdlib.h>就OK了(然而并不是,因为我出错的当前代码就是用的<stdlib.h>);

        有说改为“#include <cstdlib>”就好了,然而这样修改后报错依旧。

        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 for intlongfloatdoublelong double should exist. But the overload for short does not exist. But as the conversion sequence from short to int is only a promotion, and the conversion sequence form short to the other overloaded types are all conversions, the overload for int should 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

        唯一的区别就是,stdoutstderr被导入文件的同时,还可以看到屏幕输出。

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)种方法解决掉了目前的问题:

         有关格式的问题还有待调查。

        

 

        

本文标签: 踩到日常