静态函数问题

发布于 2022-10-15 05:16:51 字数 1166 浏览 18 评论 0

本帖最后由 garyv 于 2011-06-03 11:49 编辑

头文件comm.h

  1. #ifndef __COMM_H__
  2. #define __COMM_H__
  3. static /*inline*/ int get_val(void)
  4. {
  5.     return 3;
  6. }
  7. #endif

复制代码C文件a.c

  1. #include <stdio.h>
  2. #include <comm.h>
  3. void func(void);
  4. int main(int argc, char *argv[])
  5. {
  6.     func();
  7.     printf("%d\n", get_val());
  8.     return 0;
  9. }

复制代码C文件b.c

  1. #include <stdio.h>
  2. #include <comm.h>
  3. void func(void)
  4. {
  5.     printf("func: %d\n", get_val());
  6. }

复制代码gcc -o app a.c b.c竟然通过了连一个警告都没有,但是我认为,函数get_val()是一个static函数,而且头文件中加了防止重复编译宏定义,那边在编译第2个c文件时应该不会展开comm.h的,也就没有定义get_val()函数才对,但是编译是正常的!求解释

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

柒七 2022-10-22 05:16:51

编译是先各自编译成模块再链接的。所以comm.h会在各个文件中展开。因为定义成static,所以模块不会导出符号,所以链接时不会出现重复定义的错误。

泪眸﹌ 2022-10-22 05:16:51

回复 2# liwangli1983

    如果你说的是对的,那么comm.h里面的宏定义#ifndef... #define... #endif这些就不起作用了,这个宏每次都没有定义?

深巷少女 2022-10-22 05:16:51

回复  liwangli1983

    如果你说的是对的,那么comm.h里面的宏定义#ifndef... #define... #endif这些 ...
garyv 发表于 2011-06-03 14:00

这些是防止对单个编译模块同一头文件多次包含的。比如头文件a.h包括了b.h,而你的C文件包括了a.h,又再次包括了b.h,#ifdef这些就起作用了。

始终要记住一点,编译是单个编译模块(或者说C文件)独立进行的。编译成目标模块后再链接成整个可执行文件。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文