# 域(module)

IDL 中支持将一个或多个类型定义使用一个域或命名空间进行包含,例如:

//IDL
	module m1{
		enum Color { blue,green};
		struct myData{…};
		union U switch(long){…};
	};
	module m2{
		typedef m1::myData MYDATA;
		typedef m1::U MYU;
		typedef m1::Color COLOR;
		typedef sequence<long> SEQL;
		typedef long LONGA[2][3];
	};
1
2
3
4
5
6
7
8
9
10
11
12
13

映射为:

	//C++
	namespace m1 {      // beginning of module m1
  		enum Color { blue, green, IDL_ENUM_Color = 99999 };
  		struct myData {…};
  		class U {…};
	};      // end of module m1
	namespace m2 {      // beginning of module m2
  		typedef m1::myData MYDATA;
  		typedef const m1::myData MYDATA_IDL_const;
  		typedef m1::U MYU;
  		typedef const m1::U MYU_IDL_const;
 		typedef m1::Color COLOR;
  		typedef const m1::Color COLOR_IDL_const;
  		typedef sequence<long> SEQL;
  		typedef long LONGA[2][3];
  		typedef long LONGA_slice[3];
  		typedef const long LONGA_IDL_const[2][3];
  		typedef const long LONGA_cslice[3];
  		LONGA_slice* LONGA_alloc();
 		LONGA_slice* LONGA_dup (LONGA_slice *IDL_p);
  		void LONGA_free (LONGA_slice *IDL_p);
	};      // end of module m2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

注意:在使用 module 时需遵循以下规则:

  • 同级域不可同名,存在包含关系的域不可同名;
  • 多个 idl 文件包含使用时,不同 idl 文件中不可存在相同域名的同级域;
  • 域的定义要在使用之前。

# IDL 定义示例

接口定义语言(IDL)字符串类型在 idl 文档中定义(以结构体为例):

module m1{
	enum Color { blue,green};
	struct myData
	{
		long l;
		string str;
	};
	union U switch(long)
	{
		case 1: short s;
		default: long l;
	};
};
module m2{
	typedef m1::myData MYDATA;
	typedef m1::U MYU;
	typedef m1::Color COLOR;
	typedef sequence<long> SEQL;
	typedef long LONGA[2][3];
};
struct UserDataType
{
	m2::MYDATA data;
	m2::MYU u;
	m2::COLOR c;
	m2::SEQL seql;
	m2::LONGA l;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 代码示例

生成测试用例后在 pub.cpp 中创建数据样本后添加赋值语句:

/* 6. 创建一个数据样本 */
/* 建议:该数据为new出来的,使用后用户需要调用delete_data进行释放内存*/
	instance = UserDataTypeTypeSupport::create_data();
	char datastr[10] = "datastr";
	instance->data.l = 1;
	strcpy(instance->data.str, datastr);
	instance->u.__d = 1;
	instance->u.s(10);
	instance->c = m2::COLOR::blue;
	instance->seql.ensure_length(2, 2);
	instance->seql[0] = 101;
	instance->seql[1] = 102;
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			instance->l[i][j] = i+j;
		}
	}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 数据收发示例:

图 1 为使用 IDL 定义示例 中结构体生成的测试 demo,在 Windows 系统上启动发布端、在 Linux 系统启动订阅端后数据收发情况。

图中标号 1 为订阅端接收到发布端一次完整数据的情况显示。

图 1 域使用数据收发示例(Windows->Linux)

图 2 为使用 IDL 定义示例 中结构体生成的测试 demo,在 Windows 系统上启动订阅端、在 Linux 系统启动发布端后数据收发情况。

图中标号 1 为订阅端接收到发布端一次完整数据的情况显示。

图 2 域使用数据收发示例(Linux -> Windows)