English 中文(简体)
职能声明和定义的一致性
原标题:Function declaration and definition consistency

我的消息来源告诉我:

The source file that defines a function should include the header that contains that function’s declaration. That way the compiler will verify that the definition and declaration are consistent.

我不敢肯定这一点是正确的,我们谈论的是哪类“一致性”? 因为如果定义和声明在返回类型或理由类型/编号上不一致,那么汇编者就认为我宣布了单独的职能,根本无法核实任何情况。

E.g. 如果我有一个头盔档案测试:h

 void func();

来源档案测试来源:

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

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

如果我来管理这一方案,汇编者只会认为,func()和 func(int)的职能不同,不会对一致性产生混淆。 它指的是什么类型的一致性?

问题回答

一个有趣的问题。 你的“资料来源”[我假定一个人或一书或......]是错误的。 尽管一项共同公约是,在名人档案中发布功能声明,其基本名称与档案中包含的职能机构相同,但并没有要求这样做。

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

你是正确的,有两个职能,名称相同,但不同的论点完全可以接受——正如宣布一项职能,但从来不界定这一职能(只要你从未称呼)。

C++的编纂者没有把你从脚射出,但良好的编码做法确实存在。

现在,你将这本书的引文编辑成问题,我可以指出,引文“应当”而不是“必须”。 共同使用既不是规定使用,也不是由语言实施。 这完全是良好的方案拟订做法。

还指出,尽管汇编者没有发现和抱怨这种照样方案。

如果您有另一个依靠您<代码>func的汇编单位,即<编码>bar.cpp 界定这种方式:

#include "test.h"

void bar()
{
    func();
}

该汇编股进口你的负责人,汇编者将假设,将再有一份标书,界定在<代码>test.h上申报的任何内容。

现在,如果只有您的<代码>测试源.cpp界定了不同的功能,而(功能签名不同的功能)则本阶段的汇编者将抱怨链接错误:文号func(中提及的符号>。 无法在其联系投入中找到任何地方!

因为如果定义和声明在回归类型或理由类型/编号上不一致,汇编者只是认为我宣布了单独的职能......

确实如此。 无论是从汇编者只想到这一点,还是从你宣布(和界定)单独职能这一意义上来说,都是如此。 在语言方面完全有效。

......并且根本不核实任何东西。

这并非完全正确。 汇编者仍然可以核实。 虽然不能(以你为例)抱怨<代码>func(int)下的定义与func(>的声明不相符,但它可以抱怨/警告说,<代码>func(int)下的定义与/strong>声明不一致。

The goal is to catch mismatches that are likely mistakes. A non-inline function with external linkage normally–if good practices are followed–should be declared (in a header) before it is defined (in a source file). If it is not, then there is reason to think the programmer made a mistake. Some compilers can be asked to issue a warning if this happens.

(由于这个问题已经老了,我做了一些挖掘。) 虽然我并不确切知道何时添加这一选择,但在提出这一问题三年前,该选择已公布于2012-03-13号。 因此,现在和提问时都是有效的答案。


gcc

gcc, 选项是https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wmissing-declarations”rel=“nofollow noreferer”>-Wmissing-declarations。 (这并未列入-Wall - Wextra,可能是因为设置并非错误,可能只是意外的):

如果全球职能的定义没有以前的声明,则警告。 即使定义本身提供了原型,也如此。 采用这一办法探测在标题档案中未申报的全球功能。 在C,没有就以往非向型声明的功能发出警告;使用<代码>-Wmissing-prototypes探测缺失的原型。 在C++,没有对职能模板或在线职能或匿名名称空间的职能发出警告。

使你的榜样与这一警告保持一致

警告:以前没有宣布无效[声明]

so you know to double-check your declaration.





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签