① 每个函数都可以被单独编译对吗
A、main函数是不能被任何函数调用的,所以a错了
B、函数可以单独编译,每个函数都能单独写成一个文件,所以B对的
C、函数都要通过main函数的调用才能正确的运行,main函数是一个程序的唯一入口
D、函数是不可以嵌套使用的
② oracle 自定义函数,调用时报“程序包或函数无效”
你的这个函数编译大概不能通过吧: lxi_split函数已经将返回值定义为TA_lxi表对象,TA_lxi表对象中的元素为TY_lxi类型的,但是在做pipe row给返回表增加元素时使用的又是字符串,这明显与定义不符合,编译会有错误的。
该函数没有编译通过,当然在调用时会提示“程序包或函数不存在”,因为该函数还没有建立。
应该定义一个TY_lxi变量,例如:
v_data TY_lxi := TY_lxi(''); -- 这里括号里面的值要随TY_lxi类型而定
然后,在循环中将字符串赋给该变量的N2成员: v_data.N2 := v_str
接下来是把该变量加入返回表: pipe row(v_data);
③ C++的函数前向声明为何不能编译器自己提前扫描变更函数时向前声明带来的维护难度
函数声明的作用是什么?
函数声明的目的是向编译器引入一个函数名字以及函数类型,这个主要用于类型检查和增加可读性。
为什么要使用函数声明?
因为函数可能在别的地方定义(如:静态库文件、动态链接库、另一个编译单元里),如果没有函数声明,编译器在编译的时候就只能根据函数调用推断函数的类型,由于C++存在的隐式转换和函数重载,根据函数调用的参数来推断函数的类型是不够的。
你说的编译器提前扫描不可行,因为C++的函数可以定义在其他地方,可能函数体已经编译成可执行代码了(动态链接库中的函数就是这中情况),其次编译器一次只能处理一个编译单元(一个文件),对于其他编译单元定义的函数,编译器管不了,所以你说的这种方法不适用C++。
看看下面的例子:
假定f函数的定义在某个库文件里,并且函数类型为 double f( double, double )
f( 3, 4 );
f( 3.0f, 4.0 );
假如允许函数不声明直接调用,编译器只能根据调用语句的参数列表的类型来确定函数的类型。对于这个例子:编译器可以认为f函数存在两个版本: void f( int, int ) 和 void f( float, double ),编译器也可以认为f函数只有一个版本: void f( float, double )。不管哪种推断 ,连接的时候都会出现连接错误。 所以你说的方法不可行。
为什么其他语言可以不声明直接使用?
其他语言(比如java和C++)可以不用声明直接使用,这是因为这些语言是解释型的语言。对于解释型的语言,代码首先经过编译器简单编译成某个中间语言,在运行的时候由解释器“一行一行”翻译。这种语言编译后的代码包含很多的信息,使用一些反编译软件几乎可以还原源代码。由于编译器认识中间语言,所以对于任何未声明或者未定义的实体的引用,编译器都能到编译好的代码中去寻找。
为什么C语言允许函数不声明直接使用?
C语言的函数不允许函数重载,所以一个函数名字一定对于一个函数定义,并且C语言的函数符号一般是一个下划线+函数名(比如上面的函数f的函数符号就是 _f ),没有上面提到的问题,编译完成后C语言的连接器就会去寻找函数符号 _f的定义,如果找到生成可执行文件,如果找不到则报错。所以C语言运行不声明函数,但是貌似最近的C语言标准已经取消了这个规则(C语言的标准我不是很关注,你想知道就自己去看看C语言的最新标准),主要的原因还是这种语法不安全。
使用前进行声明是个好习惯,可以提高阅读性,哪些不声明直接使用的代码,容易使人迷惑。
以上是我个人的看法有问题可以提出。