函数声明是强制性的吗? 我知道C++中使用函数的方式如下: function declaration // before main function calling // in main function definition // outside main
但当我在项目中使用opencv时,我也在其中创建了函数,但我没有在其中使用函数声明,而且它运行良好,没有任何错误,我使用了相同的工具、相同的语言和相同的技术。为什么函数声明在opencv中不是强制性的?还是以其他方式完成 示例代码:函数声明是强制性的吗? 我知道C++中使用函数的方式如下: function declaration // before main function calling // in main function definition // outside main,c++,opencv,C++,Opencv,但当我在项目中使用opencv时,我也在其中创建了函数,但我没有在其中使用函数声明,而且它运行良好,没有任何错误,我使用了相同的工具、相同的语言和相同的技术。为什么函数声明在opencv中不是强制性的?还是以其他方式完成 示例代码: void generateGradient(cv::Mat& mask) { cv::Point firstPt = cv::Point(mask.size().width/2, mask.size().height/2); double r
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);
}
谢谢规则很宽松:
函数的声明必须在前面出现,您才能调用它
该函数的定义必须存在于项目中的某个位置
你给出的例子符合这些规则。这也是:
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库中找到,编译程序时可以链接到OpenCV库
也就是说,您的文件如下所示:
#include <opencv/some_header>
function calling
function declaration
function calling
这很好。然后从库中链接函数定义。理论上,至少函数签名声明应该在调用时可用,因为编译器希望知道函数的签名
这就是为什么我们在cpp/c文件中包含头文件。除编译外,编译器无法识别函数签名,无法检测编译中CPP/C文件中的任何编译错误。在C++函数声明中,由于需要超载的语言特性,所以需要声明。我建议你选择一个包含C++基础知识的代码。我更新代码,但是这个问题与代码无关,它的一个与编程有关的问题,我也在考虑,但是我只是为了确认而提出问题,谢谢你的回答而不是下注和去: