【问题标题】:Static and multiple functions with same name in different headers不同标题中具有相同名称的静态和多个函数
【发布时间】:2017-12-16 16:30:55
【问题描述】:

我有两个头文件,它们定义了两个具有相同名称和不同参数的函数。我知道 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);

提前致谢。

【问题讨论】:

  • static 怎么会有所作为?这是相互矛盾的声明。
  • 在头文件中声明static函数没有多大意义。
  • 主要原因是C在创建可执行文件时会使用你的函数名来识别函数链接,如果同名出现两次,链接器将不知道哪个是好的。我不认为 static 对 C 中的名称修改有任何影响,您必须遵守 ODR(一个定义规则)。无论如何,您的想法在您的情况下不起作用,因为您的 main.cpp 文件包含这两个文件,因此从 main.cpp 的角度来看,无论如何都有 2 个可见的冲突定义。如果它是从不同的源文件中使用的,我不确定链接器是否会抱怨或选择一个函数。
  • 感谢大家的回答。
  • 请注意,以.cpp 结尾的文件名通常表示 C++ 代码而不是 C 代码。你有正确的标签吗?正确的编译器?

标签: c


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 2011-09-25
    相关资源
    最近更新 更多