📜  C++ 中的严格类型检查

📅  最后修改于: 2022-05-13 01:55:35.626000             🧑  作者: Mango

C++ 中的严格类型检查

严格的类型检查意味着必须知道每个被调用函数的函数原型(函数签名),并且被调用的函数必须与函数原型匹配。它在编译时完成。 “严格类型语言”是指一种非常强类型的语言,其中对如何对不同类型的变量执行操作有更严格的限制。

基本条款:

  • 对于每个操作:其参数的数量、顺序和数据类型。
  • 对于每个变量:每个对象的名称和数据类型。
  • 对于每个常量:名称、数据类型和值。

一般来说,强类型语言在编译时有更严格的类型规则,这意味着在编译过程中更容易发生错误和异常,这增加了交付程序的可靠性,“如果类型不匹配,编译器会产生错误”。

函数原型指定函数名称传递的参数数量以及函数的返回类型(如果有)。

例如:

void max ( int , int );
int max ( int , int );
void max();

1. 如果使用不正确的数据类型调用函数,编译器会警告用户。它可以帮助用户识别函数调用中的错误并提高程序的可靠性。

2. 检查执行路径:与严格类型检查一样,检查所有可能的执行路径,不需要进一步测试类型错误。因此在运行时不需要数据对象上的类型标签,也不需要动态检查。

C++
#include 
using namespace std;
void add(int a, double b)
{
    // printing a and b
    cout << "sum = " << (a + b);
}
void add(double a, int b)
{
    // printing a and b
    cout << endl << "sum = " << (a + b);
}
int main()
{
    // calling function on line 3
    add(10, 2.5);
 
    // calling function on line 7
    add(5.5, 6);
    return 0;
}


C++
#include 
using namespace std;
 
void add(int a, double b)
{
    // printing a and b.
    cout << "sum=" << (a + b);
}
 
void add(double a, int b)
{
    // printing a and b.
    cout << endl << "sum=" << (a + b);
}
 
int main()
{
    // calling add function on line 4.
    add(10, 2.5);
 
    // calling add function with 3
    // parameters that will give
    // error.
    add(5.5, 6, 7);
    return 0;
}


输出:

sum = 12.5
sum = 11.5

基于此,C++ 是一种强类型语言,它使用严格的类型检查。关于编译器,调用哪个函数没有混淆,因为它在编译时匹配参数的类型。

在 C++ 中,函数原型是强制性的。如果函数声明没有放在函数调用之前,它将引发错误,而在 C 编程语言中它是可选的。 C++ 在编译期间根据其原型声明检查传递给函数的所有参数。如果它的参数类型不匹配,它会产生错误,这可以通过放置函数的原型来克服。

C++

#include 
using namespace std;
 
void add(int a, double b)
{
    // printing a and b.
    cout << "sum=" << (a + b);
}
 
void add(double a, int b)
{
    // printing a and b.
    cout << endl << "sum=" << (a + b);
}
 
int main()
{
    // calling add function on line 4.
    add(10, 2.5);
 
    // calling add function with 3
    // parameters that will give
    // error.
    add(5.5, 6, 7);
    return 0;
}

错误:

prog.cpp: In function ‘int main()’:
prog.cpp:24:18: error: no matching function for call to ‘add(double, int, int)’
     add(5.5, 6, 7);
                  ^
prog.cpp:4:6: note: candidate: void add(int, double)
 void add(int a, double b)
      ^
prog.cpp:4:6: note:   candidate expects 2 arguments, 3 provided
prog.cpp:10:6: note: candidate: void add(double, int)
 void add(double a, int b)
      ^
prog.cpp:10:6: note:   candidate expects 2 arguments, 3 provided

这会产生错误,因为函数参数与函数add 中的参数数量不匹配。严格类型检查的好处是它允许在开发周期的早期发现许多类型错误。严格类型通常会导致编译后的代码执行得更快,因为当编译器知道正在使用的确切数据类型时,它可以生成优化的机器代码。