【问题标题】:Importance of function prototype (declarations) in header files [duplicate]头文件中函数原型(声明)的重要性
【发布时间】:2017-12-13 20:37:41
【问题描述】:

我在一个跨越多个 *.c 和 *.h 文件的项目中编写了一些代码(我想我可以将 *.c 和 *.h 称为模块或程序)并且忘记声明一个新创建的“getter”特定模块/程序的头文件中的函数。头文件包含在另一个需要访问该 getter 函数的模块中。 不知何故,程序运行良好!

  1. 如果链接器能够链接目标文件以自行解决问题,我想知道在标头中声明函数原型的重要性。重复函数解析???这意味着链接器通过将函数名称与函数中调用的内容匹配来按函数名称链接。
  2. 链接器如何处理外部变量?

【问题讨论】:

    标签: c header prototype declare


    【解决方案1】:

    C 曾经允许隐式 声明函数。如果一个函数在被调用时没有被声明,编译器会使用这个调用来推断(猜测)声明。这个推论可能是正确的,也可能是错误的,如果它是错误的,那么在你运行程序时会导致未定义的行为

    有了正确的原型声明,编译器就不必猜测了。

    【讨论】:

      【解决方案2】:

      原型告诉编译器函数涉及的类型(返回值和参数)。如果没有原型,它们都是隐含的int。这可能适用于 一些 函数,但在标准 C 中已弃用(并且从 C99 开始不允许;这在标准前 C 中很常见),因此您应该始终拥有为您调用的任何函数声明原型。如果您启用警告,一个好的编译器会警告您。例如。对于gcc,始终使用类似-std=c11 -Wall -Wextra -pedantic(或-std 的一些较旧的C 标准)来获得有用的警告。

      【讨论】:

      • @菲利克斯。我使用 GCC 将 MPLAB X 用于 PIC 32,但我不确定是否设置了警告。该函数也是布尔类型的,是一个标志。所以Without a prototype, they are all implicitly int。即使实际的函数定义是返回类型void,它仍然会将它作为返回类型int
      • 你想告诉什么?是的,如果没有原型,则假定函数返回int,无论如何。 bool 很可能与此兼容。
      猜你喜欢
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 2012-07-15
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多