g ++如何报告给定代码的错误?

时间:2014-05-07 23:30:00

标签: c++ g++

这是我对why is elapsedtime giving me an output of 1?

的回答的延续

我能够使用g ++ 4.7.3成功编译和构建以下程序。

#include <iostream>
using namespace std;

int elapsedtime(int time1, int time2)
{
   return (time2-time1);
}

int main()
{
   int time1;
   int time2;
   cin >> time1 >> time2;
   cout << "Your elapsed time is " << elapsedtime <<endl;
}

main中最后一行的意图是:

   cout << "Your elapsed time is " << elapsedtime(time1, time2) <<endl;

g ++如何能够无错误地编译第一个版本?

3 个答案:

答案 0 :(得分:4)

如果有适当的警告级别,GCC会发出警告:

  

test.cpp|14 col 39| warning: the address of 'int elapsedtime(int, int)' will always evaluate as 'true' [-Waddress]

查看GCC 4.7 On Coliruclang too

答案 1 :(得分:3)

因为它是完全有效的C ++。

函数名称可以隐式转换为指向该函数的指针。

对于MSVC,标准库为任意指针提供输出操作符,用于打印该指针的数值。

对于GCC / Clang,结果有点复杂:它们(正确地)没有实现与函数指针匹配的插入器。而是将函数指针隐式转换为bool,其为true(1),因为指针不为null。转换序列也可以像这样明确写出。

int(*p)(int, int) = elapsedtime;
bool b = p;
cout << "Your elapsed time is " << b <<endl;

请注意,使用适当的警告级别,当隐式转换序列导致函数名称被评估为true时,g ++和clang都会发出警告,警告类似于:

warning: address of function 'elapsedtime' will always evaluate to 'true' [-Wbool-conversion]

答案 2 :(得分:2)

std::ostreamoperator << (bool),函数名在标准下可以隐式转换为bool(通过函数到指针的转换,然后是布尔转换)。相关语言为(§4[conv] / p1,§4.3[conv.func],§4.12[conv.bool]):

  

标准转换序列是一系列标准转换   按以下顺序:

     
      
  • 来自以下集合的零或一次转换:左值到右值的转换,数组到指针的转换以及函数到指针的转换。
  •   
  • 来自以下设置的零次或一次转换:整数促销,浮点促销,整数转换,浮点转换,浮点积分转换,指针转换,指向成员转换的指​​针以及布尔转换。
  •   
  • 零或一个资格转换。
  •   
     

函数类型T的左值可以转换为类型的prvalue   “指向T的指针”结果是指向函数的指针。

     

算术,无范围枚举,指针或指针的prvalue   成员类型可以转换为bool类型的prvalue。零   转换value,null指针值或null成员指针值   到false;任何其他值都将转换为true