一个蛮有意思的问题,朋友问我的。 先看遇到问题的代码
#include<iostream> using namespace std; int a[5] = {1,2,3,4,5}; int f(int i){ if(i < 5) return a[i]+f(i+1); } int main(){ cout << f(0) << endl; return 0; }很明显这里的 f( ) 有问题,因为 i == 5的时候没有返回值
如果是clang这里会直接报错。
gcc编译会因为<iostream>报错
/tmp/ccv3ma76.o:在函数‘main’中: a.cpp:(.text+0x47):对‘std::cout’未定义的引用 a.cpp:(.text+0x4c):对‘std::ostream::operator<<(int)’未定义的引用 a.cpp:(.text+0x51):对‘std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)’未定义的引用 a.cpp:(.text+0x59):对‘std::ostream::operator<<(std::ostream& (*)(std::ostream&))’未定义的引用 /tmp/ccv3ma76.o:在函数‘__static_initialization_and_destruction_0(int, int)’中: a.cpp:(.text+0x87):对‘std::ios_base::Init::Init()’未定义的引用 a.cpp:(.text+0x96):对‘std::ios_base::Init::~Init()’未定义的引用注释掉相关代码以后还是会报错,也就是说只要include这个头文件就会报错
/tmp/ccs8zhVg.o:在函数‘__static_initialization_and_destruction_0(int, int)’中: a.cpp:(.text+0x7f):对‘std::ios_base::Init::Init()’未定义的引用 a.cpp:(.text+0x8e):对‘std::ios_base::Init::~Init()’未定义的引用删除iostream以后,改用cstdio的printf可以正常编译 找到报错原因了,主要是因为gcc不会自动链接STL标准库,加上参数-lstdc++可以正常编译,详细解释可以看这篇博客。
g++可以直接成功编译,没有任何问题。在gcc和g++编译以后都可以运行。
运行结果是20,而不是15。
先查看相关的的汇编码:
_Z1fi: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 pushq %rbx subq $24, %rsp .cfi_offset 3, -24 movl