>我写了这段代码:
// 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
只包含 C 版本的print()
的定义。
- 当我使用
G++
编译和构建程序时,我print.o
与源文件一起传递给它main.cxx
。它产生可执行文件并且工作正常,但在main.cxx
内部我调用了print
的C++版本(print(double)
和print(std::string)
),这些版本没有在prnint.o
中定义,因为它是使用 GCC 编译的,并且由于宏__cplusplus
(条件编译)。那么为什么链接器不抱怨缺少这些函数的定义呢?谢谢!
我使用没有定义C++版本的
gcc
编译print.cxx
...
差一点。gcc
和g++
都调用相同的编译器套件。该套件具有一组文件扩展名,它会自动识别为 C 或 C++。*.cxx
文件全部编译为 C++,这是该扩展的默认行为。
您可以使用-x
选项覆盖默认行为。