你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

一个比较生僻的C语言知识点

[复制链接]
gaosmile 发布时间:2020-10-7 21:51
    今天分享的是一个比较生僻的C语言知识点,大家平时都用过#include"xxx.h"应该很少或者几乎没有见过.c文件作为头文件吧,那么今天bug菌就跟大家一起来学习一下。
% F# ?) \. Y7 x
1、操作一波
   
    咱们先体验一波#include"xxx.c"文件能不能用:
+ i6 v" ~' ]$ N4 b3 s' R) y
7 p7 l+ S" _! ^2 ?' ]; d
01 体验一下

0 i4 K* x! f4 S3 Q9 h1 E
参考demo:
1//FileName :main
# V& W# r* b2 B5 T8 o# h; d& C3 W 2#include <stdio.h>
/ X8 Q7 `- w4 f: m, h. D& P- j' r 3#include <stdlib.h>0 N3 g7 f/ ?8 \' f& Q8 {
47 z- l$ }) ]  ?4 L# _9 N% V9 T
5/***************************
! y- Z; K1 c  }0 B0 |4 s" U. R 6 * .c文件声明区域
( a- D0 O4 N9 r 7 **************************/
: L/ z1 o" A% g/ z4 r# A 8#include"module1.c"
/ g2 u, O( |' W6 ^1 o8 ]+ l 9#include"module2.c"
! l3 M. e) ^4 F- m( w& d; C10# V; E7 ?/ \5 q+ ~+ C
11/***************************9 W- _7 r/ v: v2 c: P# z
12 * Fuction: main
/ e8 a& B" o( }13 * Author 公众号:最后一个bug) , }& o5 `! T! j9 ?9 g
14 **************************/
% c- ~+ @  i# F15int main(int argc, char *argv[]) {
4 P7 f8 R* ]6 B8 \" _, E( ?) C16
" m! c/ L1 \3 \- V% ~& V17    Fuction1(); : v/ F1 Q2 y. o4 A
18    Fuction2();
/ w1 W0 h7 @' @19    printf("欢迎关注公众号:最后一个bug\n");
# T* W: C0 ~/ Y( w# T3 z3 {20    return 0;
/ V+ }% U; G& f! k" H2 u21}
9 ^$ k( S" n' P7 }
# ^- A: L. Y- N! k
1//FileName: Module1.c 3 I, W6 [% V+ b7 ]) M6 P
2#include<stdio.h>$ ~. x$ G) C  v
3/***************************
* F$ v0 ]( Z  y- |2 {5 U 4 * Fuction: Fuction1. y0 Y! {, Y# B8 x
5 * Author 公众号:最后一个bug) 0 V7 q6 W! M* \+ M4 K
6 **************************/3 @! V: X. ^$ F
7void Fuction1()9 h! W; ?* c# E; y7 N) {
8{
& R: |; p3 E  k- _! R4 g: v7 F 9    printf("Run Fuction1\n");  c6 X8 V& M: @# Z
10}
6 c. V* B5 W8 J/ }7 t' I8 Q4 Y
1//FileName: Module2.c ) N# L: _. V( n8 R
2#include<stdio.h>
4 t& y  V) U% t! w% q 3/***************************
+ U. ?# W( F  ^  T$ ?: j0 H4 d 4 * Fuction: Fuction25 N7 r9 {) U- ~( r- Z- o
5 * Author 公众号:最后一个bug)
5 G+ T- Q) ?6 f/ e( X9 j 6 **************************/
2 v# F3 q' @) b+ p+ j) b 7void Fuction2()
: c; b; s% e7 S+ ?8 g 8{
! P; C( D8 {  `9 c: E 9    printf("Run Fuction2\n");$ W' K6 E2 l- F
10}
输出结果:
微信图片_20201007214846.png
分析一下:
    看来这波操作可行,似乎还省去了.h文件,之前bug菌说过,分析.h文件的时候直接把.h文件在对应的.c文件中的位置处展开然后进一步分析即可,其实这.c文件也是如此,接着往下看。
/ `8 _, ?, E, |( s2 d+ W
2 n% l0 Y( f4 Y5 I6 p- S) x
02 加深理解
" j7 i/ ]$ T3 a6 ^9 |
参考demo:
1//FileName :main
; M1 C3 v; c3 W; [# w 2#include <stdio.h>& b# p& _7 A. d, v
3#include <stdlib.h>
8 O6 G( r6 v" |7 ? 4! H8 K' X  e: {8 ~
5char * cBug1 = "bugNo1";  //这里是位置1
, C. V1 t3 e7 ]7 ^5 W 6char * cBug2 = "bugNo2";2 Q* d. R0 I" @0 c8 k3 y- a. H/ b
7/***************************% l9 j  y3 f6 F
8 * .c文件声明区域 + {  o- p  K3 e! l7 u9 V
9 **************************/& h9 _6 i% j# X. u1 D* e9 z* r3 I4 @
10#include"module1.c"
0 t4 P) X4 }3 G! ~; M11#include"module2.c"; `% Q: o: i9 [1 v( C9 w2 W( @
12
- j1 @* r+ X9 Y0 ?# l13//char * cBug1 = "bugNo1";//这里是位置2
! Q4 \" e8 x, p. \: y2 `; W# R2 i14//char * cBug2 = "bugNo2";
, b  z. y3 [5 i/ i+ j) X9 F! S, s153 L- \, p& ]  U/ ]
16/***************************
* P9 K7 G: M+ V! Q( L' D5 X5 G17 * Fuction: main- \, R# k6 D( f
18 * Author 公众号:最后一个bug) / W" M4 C' ~" Q$ H: ^
19 **************************/
2 V5 a% \- S; e' w3 n; [) T20int main(int argc, char *argv[]) {( m3 g' L" o9 \& H; n; N* c
21
1 f; [; `- \) ^8 ?  j22    Fuction1(); , X  f% d8 p& c9 g( l& e
23    Fuction2();
+ B0 p0 l% m: N, t0 M' |2 }24    printf("欢迎关注公众号:最后一个bug\n");
7 z. c. \7 d( j6 z: X9 t$ S8 S4 K25    return 0;
. X3 [0 W% ]7 o3 j) l2 x4 u26}0 v( {( M& O9 r
, Z6 o( U9 _1 r0 @1 l
1//FileName: Module2.c . d: {: O7 ~+ }. o
2#include<stdio.h>
  d+ ^* k8 |& w) e- x6 ? 3/***************************
# G8 Q2 D5 y7 V+ | 4 * Fuction: Fuction1
' Y2 V$ B: z  h6 _ 5 * Author 公众号:最后一个bug) 4 l! p+ K" z' Z- j% \, B
6 **************************/6 d0 q5 _/ ~4 O' o, s9 y0 X1 b$ b  l; }/ J
7void Fuction1()
. f: o' g* _0 @% {2 R 8{
) a/ k# w/ ]+ g# F 9    printf("Run Fuction1\n");4 `& u4 f, z# e; J4 J
10    printf("%s\n",cBug1);
) H6 |. p* Y  C3 b3 i& u: m, W11}
& {; z/ s0 V! t, D. [
8 T& h+ ]& ^( y$ X% G2 W
1//FileName: Module2.c ' R; {0 V( I8 j* L' l' Q# F
2#include<stdio.h>( S. A1 @7 |. ~$ Z
3/***************************
9 Y7 D: Q& ]7 [ 4 * Fuction: Fuction2
. H8 B" e+ i* {% M! x 5 * Author 公众号:最后一个bug)
" J" B$ ]$ [' t- N) ?4 W 6 **************************/9 U+ n) J6 ?% \' Q& Y- L
7void Fuction2()9 c7 B8 y3 P$ }
8{4 x) D9 T: [5 h- Y6 D- I9 f
9    printf("Run Fuction2\n");
# x+ m! @% }) [  ]' }0 [- Z8 U10    printf("%s\n",cBug2);0 p* M4 P2 ]( \% a/ J* ]* b4 I4 A
11}
输出结果:
微信图片_20201007214851.png
分析一下:
    我们在位置1进行两个变量的定义,成功编译运行得到如上的结果,符合我们的预期,然而当我们去掉位置1进行位置2的定义,程序却无法进行编译,看来跟我们预期在编译过程中直接展开.c文件是一致的。
/ V) S' P9 d6 V) K
3、有什么用?
   
    这种方式在bug菌的编码历史长河中一般只在两种情况下用到:
9 V8 F, B2 L  x& z3 n8 O' F3 |: h* h
1、维护毫无设计的代码. e% [' z2 O$ o+ i4 |# u

$ {. Z& W* W$ P0 s* c. o  y/ ^

7 N3 r) d6 x$ P! H
+ H  M" p: Q# [4 z7 o
    有些历史悠久的项目经过了N多位大佬的蹂躏,说实在的代码结构上已经非常可怕了,往往每个源文件内容非常之长,为了保持代码原样,会采用#include"xxx.c"把这几的相关文件嵌入进去,也便于自己后期维护。
6 \# k6 l. b. e/ t
+ F3 P% H3 x4 J; ^4 ]3 V: ]
2、测试代码             0 s% Q( N/ F( r5 x; Q6 ^8 P" m- Q

: Z' B- `. A7 w9 K
! u7 R  x4 X( z7 d7 R' j
    在前期进行软件调试的时候可能自己会在不同的文件中安插不同测试功能函数,通过这样方法可以方便的引入和剔除。
, B& `( E& J# I. T
    比如说你需要对源文件中的一些静态变量进行相关的监控处理,然而又不想在本文件中增加测试代码,于是便可以在#include"xxx.c"中进行测试函数的编写来供使用,比如 :

( L: b9 t& ^9 C' S! b. q" ]
1//FileName :main 0 t# M6 P9 T0 K& n# G1 E
2#include <stdio.h>3 t4 G4 D/ K) C& \5 t- W2 A
3#include <stdlib.h>% ?4 |1 _; b1 G! d5 B5 K
4
) v& [* j/ O# s8 t 5static int a = 5; 6 R0 Z0 C! ?* J. j; x- o1 [7 d
6/***************************9 |3 {" l% h4 N$ Y+ c% H0 V; [" r
7 * .c文件声明区域
, B- I( _% }. Q( c4 {  J 8 **************************/
% B/ H9 V( e+ \. x 9#include"module1.c"$ X" p  [! R. {! W+ h
10
! N/ R# O1 y8 F; [; K& q# n11/***************************
9 e& g% r. C. i( s) T: _5 W5 Y12 * Fuction: main
. y) x! O% ^( U( I% P( d+ j13 * Author 公众号:最后一个bug) 9 N) H! ~5 s* C! M% }6 E/ M6 Y
14 **************************/
) R9 s; O! m: d3 u' U' d* \2 _  b15int main(int argc, char *argv[]) {
6 c& Z. x5 h, L; E16- ^, f. H8 U2 b1 T" X$ a) y
17    Fuction1(); 8 |8 ]# r0 J% b% q* O
18    printf("main %d\n",a);8 w/ m- b1 f) X/ N9 Z; @) I
19    printf("欢迎关注公众号:最后一个bug\n");' y5 z; z. {* |# y7 z
20    return 0;9 o/ L& T1 C% A( {6 H
21}
9 }( b" f( K6 Z" ]4 ^5 A
' r, T5 R  D8 }. L  J% {- w
1//FileName: Module2.c
3 ?" q# k9 X" ^5 X 2#include<stdio.h>
1 ?* C  V7 [/ y3 f8 Z 3/***************************
2 ]. A9 M- M, k; y7 Y 4 * Fuction: Fuction1# h" {/ c1 d2 A8 K' t+ {
5 * Author 公众号:最后一个bug) 7 p+ Z1 ^% L6 y9 z1 K, ?5 R  W
6 **************************/
$ ?/ T0 ]# _  f7 y& |# X/ n 7void Fuction1()7 G. N" ^* S, X+ f$ v" N1 l
8{
% u9 Y" F7 X4 o: _! ~ 9    printf("Run Fuction1\n");
4 d+ C' p; ]9 O; ~3 g10    printf("Fuction1 %d\n",a);
. D* B* _6 p% T0 t11}
3 T+ u' s) O, S$ m* o0 \- A  d

4 Y4 m, E- h& t! l# u
微信图片_20201007214855.png
* Y* H7 z" v! F* M2 h  G

3 O; L- d( e9 U5 k7 T4 k
注意了!!
; F) `4 W/ `* b" T2 K6 Q  o
/ k9 r3 m/ o4 |/ o8 r9 g
    那么之前有小伙伴说 : " static的作用域仅仅在对应的文件中 ",通过上面的多个.c文件使用静态a变量,那么这位小伙伴表述就不那么贴切了!

, U* U* V" R; ]
4、最后总结
   
    大家在正常的开发过程中bug菌还是不建议使用#include"xxx.c",因为在我们程序的设计过程中,.h文件就是一种外部的引用接口,而.c是对应的内部实现,如果滥用#include"xxx.c"有可能造成函数等等的重复定义,同时也对调试相关程序带来一些困扰,当然如果游刃有余就没啥问题的啦。
) E# U0 J4 Z+ C7 }+ U- `. Q
   不过对于喜欢写长文件的小伙伴来说却是是福音,把一个长的.c文件分成多个.c文件,这样至少可以把不知道这种用法的同事面前秀一秀!

9 w7 K0 k0 v- ~9 ~& H( `. e
赞 收藏 评论0 发布时间:2020-10-7 21:51

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版