为什么 C++ 链接器不抱怨缺少这些函数的定义?

Why the C++ linker doesn't complain about missing definitions of theses functions?

我写过这段代码:

// print.h
#pragma once

#ifdef __cplusplus
#include <string>

void print(double);
void print(std::string const&);
extern "C"

#endif

void print();

和源文件:

// print.cxx
#include "print.h"
#include <iostream>

void print(double x){
  std::cout << x << '\n';
}

void print(std::string const& str){
   std::cout << str << '\n';
}

void print(){
   printf("Hi there from C function!");
}

和驱动程序:

// main.cxx
#include "print.h"
#include <iostream>

int main(){

  print(5);
  print("Hi there!");
  print();

  std::cout << '\n';
}

当我编译时:

gcc -c print.cxx && g++ print.o main.cxx -o prog

我使用 gcc 编译了 print.cxx,它没有定义 C++ 版本 print(double)print(std::string)。所以我得到 print.o 只包含 print().

的 C 版本的定义

I compiled print.cxx using gcc which doesn't define the C++ version...

不完全是。 gccg++ 都调用相同的编译器套件。套件 has a set of file extensions 自动识别 为 C 或 C++。您的 *.cxx 文件全部编译为 C++,这是该扩展的默认行为。

您可以使用 -x 选项来覆盖默认行为。