Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数声明是强制性的吗? 我知道C++中使用函数的方式如下: function declaration // before main function calling // in main function definition // outside main_C++_Opencv - Fatal编程技术网

函数声明是强制性的吗? 我知道C++中使用函数的方式如下: function declaration // before main function calling // in main function definition // outside main

函数声明是强制性的吗? 我知道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

但当我在项目中使用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);
    }
谢谢

规则很宽松:

函数的声明必须在前面出现,您才能调用它

该函数的定义必须存在于项目中的某个位置

你给出的例子符合这些规则。这也是:

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++基础知识的代码。我更新代码,但是这个问题与代码无关,它的一个与编程有关的问题,我也在考虑,但是我只是为了确认而提出问题,谢谢你的回答而不是下注和去: