函数声明和定义一致性

时间:2015-03-31 18:53:31

标签: c++ declaration consistency

我有一个来源告诉我:

  

定义函数的源文件应包含包含该函数的标头   功能的声明。这样编译器将验证定义和   声明是一致的。

我不确定这是怎么回事,我们谈论的是什么类型的“一致性”?因为如果定义和声明在返回类型或参数类型/数字中不一致,编译器会认为我正在声明一个单独的函数,并且根本不会验证任何内容。

E.g。如果我有一个头文件test.h:

 void func();

源文件testsource.cpp:

 #include <iostream>
 #include "test.h"
 using namespace std;

 void func(int x){
     cout << "Hello StackOverflow" << endl;
 }

如果我要运行这个程序,编译器会认为func()和func(int)是不同的函数,并且不会引起关于一致性的大惊小怪。它指的是什么类型的一致性?

2 个答案:

答案 0 :(得分:3)

一个有趣的问题。你的“来源”[我认为这是一个人或一本书,或......]是错误的。尽管在头文件中使用与文件包含函数体相同的基本名称的函数声明是一种常见的约定,但是没有必要这样做。

当然,除了良好的编码标准外。

你是对的,两个具有相同名称但不同参数的函数是完全可以接受的 - 就像声明一个函数但从未定义它一样(只要你从不调用它。)

C ++编译器不会阻止你自己拍摄,但良好的编码实践确实如此。

现在你已经将书中的引用编辑成了问题,我可以指出引用说“应该”不是“必须”。常识用法既不是强制性的,也不是语言强制执行的。这只是一个很好的编程实践。

另请注意,尽管编译器没有这样做,但lint类型的程序可能会检测到并抱怨这一点。

答案 1 :(得分:1)

如果你有另一个编译单元取决于你的func,比如这样定义的bar.cpp

#include "test.h"

void bar()
{
    func();
}

此编译单元导入您的标头,编译器将假定将有另一个目标文件定义该test.h标头中声明的内容。

现在,如果您只让testsource.cpp定义了一个不同的函数(而不是函数签名不同的函数),则此阶段的编译器会抱怨链接错误:引用的符号func()bar.cpp中无法在其链接输入中的任何位置找到!