Строгая проверка типов означает, что прототип функции (подпись функции ) должен быть известен для каждой вызываемой функции, а вызываемая функция должна соответствовать прототипу функции. Это делается во время компиляции. «Строго типизированный язык» относится к очень строго типизированному языку, в котором существуют более строгие ограничения на то, как операции могут выполняться над переменными разных типов.
Основные условия:
- для каждой операции: количество, порядок и типы данных ее аргументов.
- для каждой переменной: имя и тип данных каждого объекта.
- также для каждой константы: имя, тип данных и значение.
Как правило, строго типизированный язык имеет более строгие правила типизации во время компиляции, что означает, что во время компиляции более вероятно возникновение ошибок и исключений, что повышает надежность поставляемой программы: «компилятор генерирует ошибки, если типы не совпадают». «.
Прототип функции указывает имя функции и количество переданных аргументов, а также тип возвращаемого значения (если есть) функции.
Например:
void max ( int , int ); int max ( int , int ); void max();
1. Компилятор предупреждает пользователей, если функция вызывается с неправильными типами данных. Это помогает пользователю выявлять ошибки в вызове функции и повышает надежность программы.
2. Проверенный путь выполнения: как и при строгой проверке типов, проверяются все возможные пути выполнения, и дальнейшее тестирование ошибок типов не требуется. Таким образом, теги типов для объектов данных во время выполнения не нужны, и не требуется динамическая проверка.
С++
#include <iostream>
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;
}
Выход:
sum = 12.5 sum = 11.5
Исходя из этого, C++ является строго типизированным языком и использует строгую проверку типов. У компилятора нет путаницы в том, какую функцию вызывать, потому что она соответствует типам аргументов во время компиляции.
В C++ прототипирование функций является обязательным. Если объявление функции не помещено перед вызовом функции, это вызовет ошибку, тогда как в языке программирования C это необязательно. C++ проверяет все параметры, переданные функции, на соответствие объявлению ее прототипа во время компиляции. Она выдает ошибки, если в ее типе аргумента есть несоответствие, и это можно преодолеть, поместив прототип функции.
С++
#include <iostream>
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. Преимущество строгой проверки типов заключается в том, что она позволяет обнаруживать многие ошибки типов на ранних этапах цикла разработки. Строгая типизация обычно приводит к более быстрому выполнению скомпилированного кода, потому что, когда компилятор знает точные типы данных, которые используются, он может создавать оптимизированный машинный код.