# 域(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
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
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
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
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)