GnuCOBOL中实现源文件内数据与子程序互访的最优方案咨询
GnuCOBOL单源文件内变量与子程序共享的最优方案
现有方案的局限
你尝试的两种方案各有不足:
- 方案1(EXTERNAL变量):通过
EXTERNAL标记实现跨程序数据共享,但变量会暴露给所有链接的源文件,存在安全隐患 - 方案2(嵌套子程序):主程序内的
GLOBAL变量可被子程序访问,但子程序只能被主程序调用,子程序间无法互相调用
更优方案:编译单元级(源文件级)共享
利用COBOL标准的GLOBAL属性,结合GnuCOBOL的编译选项,实现仅当前源文件内的变量共享+子程序互相调用,同时避免变量暴露给外部源文件。
实现思路
- 在主程序中定义
GLOBAL变量,同编译单元(源文件)内的所有子程序可直接访问 - 子程序无需重复定义变量,直接引用主程序的
GLOBAL变量即可 - 使用GnuCOBOL的
-fno-external-globals编译选项,限制GLOBAL变量仅在当前源文件内可见,禁止外部源文件访问 - 同源文件内的子程序可以互相调用,无需额外配置
代码示例
IDENTIFICATION DIVISION. PROGRAM-ID. MAIN-APP. DATA DIVISION. WORKING-STORAGE SECTION. *> 定义编译单元级全局变量,仅当前源文件可见 01 CALLS PIC 9(3) GLOBAL VALUE 0. 01 MAIN-NAME PIC X(10) VALUE 'MAIN-APP'. PROCEDURE DIVISION. CALL 'CALL-SHOW' USING MAIN-NAME, 'CALL-SHOW'. CALL 'ROUTINE1' USING MAIN-NAME. CALL 'ROUTINE2' USING MAIN-NAME. GOBACK. *> 同编译单元内的子程序,可直接访问GLOBAL变量,且支持互相调用 IDENTIFICATION DIVISION. PROGRAM-ID. CALL-SHOW. DATA DIVISION. LINKAGE SECTION. 01 CALLER PIC X(10). 01 CALLED PIC X(10). PROCEDURE DIVISION USING CALLER, CALLED. ADD 1 TO CALLS. DISPLAY CALLS ' CALLS' END-DISPLAY. DISPLAY CALLER ' CALLED ' CALLED END-DISPLAY. GOBACK. END PROGRAM CALL-SHOW. IDENTIFICATION DIVISION. PROGRAM-ID. ROUTINE1. DATA DIVISION. WORKING-STORAGE SECTION. 01 ROUTINE-NAME PIC X(10) VALUE 'ROUTINE1'. LINKAGE SECTION. 01 CALLER PIC X(10). PROCEDURE DIVISION USING CALLER. CALL 'CALL-SHOW' USING CALLER, ROUTINE-NAME. CALL 'CALL-SHOW' USING ROUTINE-NAME, 'CALL-SHOW'. CALL 'ROUTINE2' USING ROUTINE-NAME. GOBACK. END PROGRAM ROUTINE1. IDENTIFICATION DIVISION. PROGRAM-ID. ROUTINE2. DATA DIVISION. WORKING-STORAGE SECTION. 01 ROUTINE-NAME PIC X(10) VALUE 'ROUTINE2'. LINKAGE SECTION. 01 CALLER PIC X(10). PROCEDURE DIVISION USING CALLER. CALL 'CALL-SHOW' USING CALLER, ROUTINE-NAME. CALL 'CALL-SHOW' USING ROUTINE-NAME, 'CALL-SHOW'. *> 直接访问主程序的GLOBAL变量 DISPLAY 'ROUTINE2: CALLS COUNT IS ' CALLS END-DISPLAY. GOBACK. END PROGRAM ROUTINE2. END PROGRAM MAIN-APP.
编译命令
使用GnuCOBOL编译时添加-fno-external-globals选项,确保变量仅在当前源文件内可见:
cobc -x -fno-external-globals your-program.cob
方案优势
- 变量仅在当前源文件内共享,不会被其他链接的源文件访问,安全性更高
- 子程序间可互相调用,灵活度优于嵌套子程序方案
- 无需重复定义共享变量,代码更简洁
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

