我知道我们在c ++中使用该函数的方式如下
function declaration // before main
function calling // in main
function definition // outside main
但是当我在项目中使用opencv时,我也在其中使用了函数,但我没有在其中使用函数声明并且它没有任何错误地工作正常,我使用相同的工具,相同的语言相同的技术。为什么函数声明在opencv中不是强制性的?还是以其他方式完成?
示例代码:
void generateGradient(cv::Mat& mask)
{
cv::Point firstPt = cv::Point(mask.size().width/2, mask.size().height/2);
double radius = 1.0;
double power = 0.8;
double maxImageRad = radius * getMaxDisFromCorners(mask.size(), firstPt);
mask.setTo(cv::Scalar(1));
for (int i = 0; i < mask.rows; i++)
{
for (int j = 0; j < mask.cols; j++)
{
double temp = dist(firstPt, cv::Point(j, i)) / maxImageRad;
temp = temp * power;
double temp_s = pow(cos(temp), 4);
mask.at<double>(i, j) = temp_s;
}
}
}
int main()
{
cv::Mat img = cv::imread("stack-exchange-chefs.jpg");
cv::Mat maskImg(img.size(), CV_64F);
generateGradient(maskImg);
}
谢谢
答案 0 :(得分:4)
规则是(宽松地):
以前必须先声明一个函数声明才能调用它。
该功能的定义必须存在于项目的某个位置。
您提供的示例符合这些规则。这样做:
function definition
function calling
因为定义是声明。
我们希望将代码拆分为不同的文件。项目中的每个.cpp
文件都是单独编译的,然后链接在一起。编译文件并且找不到函数的定义是可以的,只要链接阶段稍后找到该定义。
这就是C ++程序的基本结构如何工作。例如,您可能包含文件main.cpp
和A.cpp
,其中包含A.h
。在main.cpp
内,我们使用的函数在A.h
中声明并在A.cpp
中定义。即使单独编译main.cpp
和A.cpp
,也会在最后将两者链接在一起时找到main.cpp
使用的函数的定义。 main.cpp
只需要声明该函数,该函数在A.h
中给出。
有可能,你要包含OpenCV的标题。这就像在前面的例子中包含A.h
一样。它为您提供了一些您可能想要使用的函数声明。然后,您不需要自己编写声明,因为它是由标题提供的。该函数的实际定义已经编译,可以在OpenCV库中找到,您可以在编译程序时链接到该库。
也就是说,您的文件如下所示:
#include <opencv/some_header>
function calling
如果你预处理了这个文件,你就会把标题的内容带进去,它看起来像这样:
function declaration
function calling
这很好。然后从库中链接函数定义。
答案 1 :(得分:0)
理论上至少是函数签名声明在调用时应该可用,因为编译器想要知道函数的签名。
这就是我们将头文件包含到cpp / c文件的原因。除了include之外,编译器无法识别函数签名,也无法在编译中检测cpp / c文件中的任何编译器错误。
答案 2 :(得分:0)
在C ++中,函数声明是必需的,因为重载等语言功能依赖于它。