不同标头中具有相同名称的静态和多个函数

时间:2017-12-16 16:30:55

标签: c

我有两个头文件,它们定义了两个具有相同名称和不同参数的函数。我知道c不支持函数重载,但我认为在函数声明中添加static会允许我声明两个具有相同名称的函数,并且我只能在同一个源文件中访问它们。无论如何它不起作用,我不知道为什么不呢?我的理解错了吗?

实施例: file1.h具有以下功能:

static bool do_something(int a);

file2.h具有以下功能:

static bool do_something(char b);

main.cpp包含两个标题:

#include "file1.h"
#include "file2.h"

示例错误:

file1.h:26:13: error: conflicting types for ‘do_something’
static bool do_something(int a);

file2.h:23:13: note: previous declaration of ‘do_something’ was here
 static bool do_something(char b);

提前致谢。

1 个答案:

答案 0 :(得分:1)

bool do_something(int a);原型。它告诉编译器函数do_something需要类型为int的参数,并返回类型为bool的值。

当您调用此函数时,编译器现在可以检查您是否传递了正确的参数,并将返回值分配给正确类型的变量。

由于C没有函数重载,您将理解在任何一个编译单元中只能有一个函数定义。编译单元是包含所有.h文件的.c源文件。

因此,上述描述对链接无任何影响。如果未调用该函数,则不需要原型;如果有原型,则不需要该功能存在。如果调用该函数,它可能存在于链接到可执行文件的任何源文件或库中。

函数定义的关键字static表示该函数只对编译单元中的其他函数可见(因此必须存在于编译单元的源代码中)。在.h文件中包含static关键字是没有意义的,因为它会告诉包含.h文件的每个源文件,如果使用该函数,该文件存在于该源文件中。

此描述确实对链接过程有影响,因为如果使用该函数,它必须存在于当前源文件中。

在您的情况下,您必须确定两个原型中的哪一个是正确的并相应地修复.h文件 - 或者声明另一个不同的函数,该函数采用另一个参数,例如: do_something_else