C++ Odr用法案例详解

// The main module. File: odr_test1.cpp 

#include <iostream>

void module1_print(); // declaration of an exeternal function

inline int f1()
{
	return 4;
}

class A
{
public:
	static double f()
	{
		return 4.1;
	}
};

const double C = 4.2;

constexpr double E = 4.5;

void print()
{
	std::cout << "main f1(): " << f1() << std::endl;
	std::cout << "main A::f(): " << A::f() << std::endl;
	std::cout << "main C: " << C << std::endl;
	std::cout << "main E: " << E << std::endl;
}

int main()
{
	module1_print();
	print();

	int i;
	std::cin >> i;	
}
// File: module1.cpp

#include <iostream>

inline int f1()
{
	return 3;
}

class A
{
public:
	static double f()
	{
		return 3.1;
	}
};

const double C = 3.2;

constexpr double E = 3.5;

void module1_print()
{
	std::cout << "module1 f1(): " << f1() << std::endl;
	std::cout << "module1 A::f(): " << A::f() << std::endl;
	std::cout << "module1 C: " << C << std::endl;
	std::cout << "module1 E: " << E << std::endl;
}
 1、在VS2017上运行的结果为:

4235090E-4133-62CD-A60D-37B51A45488B.png

2、使用clang进行编译
clang++ module1.cpp odr_test1.cpp

运行结果:

A036D442-EAC9-ECE0-44B6-0118EADC661E.png

若进行下面的编译:

clang++ odr_test1.cpp module1.cpp

则结果如下

BD6AFA28-1260-C9B2-4B06-E3A5A675B9A7.png

3、使用gcc编译
g++ module1.cpp odr_test1.cpp -std=c++11

A036D442-EAC9-ECE0-44B6-0118EADC661E.png

若进行如下编译

g++ odr_test1.cpp module1.cpp -std=c++11

BD6AFA28-1260-C9B2-4B06-E3A5A675B9A7.png

二、如何解决这个问题
// The main module. File: odr_test2.cpp
#include <iostream>
void module2_print(); // declaration of an external function

namespace
{
inline int f1()
{
return 4;
}

class A
{
public:
static double f()
{
return 4.1;
}
};
}

const double C = 4.2;
constexpr double E = 4.5;

void print()
{
std::cout << "main f1(): " << f1() << std::endl;
std::cout << "main A::f(): " << A::f() << std::endl;
std::cout << "main C: " << C << std::endl;
std::cout << "main E: " << E << std::endl;
}

int main()
{
module2_print();
print();

int i;
std::cin >> i;
}
// File: module2.cpp

#include <iostream>

namespace
{
inline int f1()
{
return 3;
}

class A
{
public:
static double f()
{
return 3.1;
}
};
}

const double C = 3.2;
constexpr double E = 3.5;

void module2_print()
{
std::cout << "module2 f1(): " << f1() << std::endl;
std::cout << "module2 A::f(): " << A::f() << std::endl;
std::cout << "module2 C: " << C << std::endl;
std::cout << "module2 E: " << E << std::endl;
}

运行结果

BF813659-5B09-08C2-77D7-23F59D503F0A.png

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的
为您推荐
    暂时没有数据