[{"data":1,"prerenderedAt":5503},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian":3,"wiki-doc-items-2023-10-05-cplusplus-jiao-xue":5121},{"id":4,"title":5,"body":6,"chapterDepth":5108,"chapterOrder":5109,"date":5110,"description":57,"docKey":5111,"docRoot":5112,"docTitle":5113,"extension":5114,"isWikiDoc":81,"isWikiIndex":5115,"meta":5116,"navigation":81,"path":5117,"seo":5118,"stem":5119,"wikiDepth":65,"__hash__":5120},"wiki\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件.md","函数与头文件",{"type":7,"value":8,"toc":5091},"minimark",[9,13,17,21,24,27,30,33,36,39,42,45,51,111,117,136,139,216,220,223,226,233,238,485,490,496,499,507,511,803,807,812,817,820,835,839,1081,1086,1089,1095,1107,1111,1302,1306,1309,1312,1319,1322,1344,1353,1361,1388,1391,1397,1400,1439,1444,1450,1457,1481,1486,1490,1493,1499,1502,1552,1557,1569,1585,1589,1591,1597,1599,1707,1712,1722,1733,1737,1739,1745,1747,1824,1829,1837,1841,1843,1849,1858,1861,1883,1886,1904,1907,1913,1916,1925,1969,1972,1979,2250,2253,2280,2293,2296,2335,2342,2353,2370,2388,2392,2394,2400,2403,2423,2425,2437,2449,2474,2477,2480,2511,2513,2539,2542,2547,2686,2689,2699,2708,2732,2745,2748,2751,2756,2759,2764,2767,2772,2775,2781,2787,2790,2793,2796,2878,2887,2896,2899,2923,2929,2932,2944,2947,2961,2971,2975,2987,2990,3053,3056,3074,3079,3153,3156,3159,3164,3179,3189,3199,3210,3214,3236,3239,3246,3252,3361,3367,3375,3383,3390,3393,3399,3404,3415,3420,3511,3519,3528,3643,3648,3721,3726,3751,3758,3763,3769,3777,3784,3789,3791,3797,3803,3826,3828,3852,3857,3947,3954,4076,4087,4100,4177,4192,4198,4221,4226,4234,4238,4247,4253,4274,4276,4282,4291,4377,4387,4392,4437,4451,4460,4527,4539,4545,4568,4583,4586,4635,4640,4773,4779,4872,4890,4898,4928,4943,4951,4962,4974,4987,5003,5006,5011,5028,5037,5040,5058,5061,5071,5081,5087],[10,11,12],"h2",{"id":12},"函数",[14,15,16],"h3",{"id":16},"概述",[18,19,20],"p",{},"**作用：**将一段经常使用的代码封装起来，减少重复代码",[18,22,23],{},"一个较大的程序，一般分为若干个程序块，每个模块实现特定的功能。",[14,25,26],{"id":26},"函数的定义",[18,28,29],{},"函数的定义一般主要有5个步骤：",[18,31,32],{},"1、返回值类型",[18,34,35],{},"2、函数名",[18,37,38],{},"3、参数表列",[18,40,41],{},"4、函数体语句",[18,43,44],{},"5、return 表达式",[18,46,47],{},[48,49,50],"strong",{},"语法：",[52,53,58],"pre",{"className":54,"code":55,"language":56,"meta":57,"style":57},"language-cpp shiki shiki-themes github-light github-dark","返回值类型 函数名 （参数列表）\n{\n\n       函数体语句\n\n       return表达式\n\n}\n","cpp","",[59,60,61,70,76,83,89,94,100,105],"code",{"__ignoreMap":57},[62,63,66],"span",{"class":64,"line":65},"line",1,[62,67,69],{"class":68},"sVt8B","返回值类型 函数名 （参数列表）\n",[62,71,73],{"class":64,"line":72},2,[62,74,75],{"class":68},"{\n",[62,77,79],{"class":64,"line":78},3,[62,80,82],{"emptyLinePlaceholder":81},true,"\n",[62,84,86],{"class":64,"line":85},4,[62,87,88],{"class":68},"       函数体语句\n",[62,90,92],{"class":64,"line":91},5,[62,93,82],{"emptyLinePlaceholder":81},[62,95,97],{"class":64,"line":96},6,[62,98,99],{"class":68},"       return表达式\n",[62,101,103],{"class":64,"line":102},7,[62,104,82],{"emptyLinePlaceholder":81},[62,106,108],{"class":64,"line":107},8,[62,109,110],{"class":68},"}\n",[18,112,113,116],{},[48,114,115],{},"运行\u002F观察结果："," 这段是语法或接口示例，重点观察写法；放入完整程序后再运行验证。",[118,119,120,124,127,130,133],"ul",{},[121,122,123],"li",{},"返回值类型 ：一个函数可以返回一个值。在函数定义中",[121,125,126],{},"函数名：给函数起个名称",[121,128,129],{},"参数列表：使用该函数时，传入的数据",[121,131,132],{},"函数体语句：花括号内的代码，函数内需要执行的语句",[121,134,135],{},"return表达式： 和返回值类型挂钩，函数执行完后，返回相应的数据",[18,137,138],{},"**示例：**定义一个加法函数，实现两个数相加",[52,140,142],{"className":54,"code":141,"language":56,"meta":57,"style":57},"\u002F\u002F函数定义\nint add(int num1, int num2)\n{\n    int sum = num1 + num2;\n    return sum;\n}\n",[59,143,144,150,180,184,204,212],{"__ignoreMap":57},[62,145,146],{"class":64,"line":65},[62,147,149],{"class":148},"sJ8bj","\u002F\u002F函数定义\n",[62,151,152,156,160,163,165,169,172,174,177],{"class":64,"line":72},[62,153,155],{"class":154},"szBVR","int",[62,157,159],{"class":158},"sScJk"," add",[62,161,162],{"class":68},"(",[62,164,155],{"class":154},[62,166,168],{"class":167},"s4XuR"," num1",[62,170,171],{"class":68},", ",[62,173,155],{"class":154},[62,175,176],{"class":167}," num2",[62,178,179],{"class":68},")\n",[62,181,182],{"class":64,"line":78},[62,183,75],{"class":68},[62,185,186,189,192,195,198,201],{"class":64,"line":85},[62,187,188],{"class":154},"    int",[62,190,191],{"class":68}," sum ",[62,193,194],{"class":154},"=",[62,196,197],{"class":68}," num1 ",[62,199,200],{"class":154},"+",[62,202,203],{"class":68}," num2;\n",[62,205,206,209],{"class":64,"line":91},[62,207,208],{"class":154},"    return",[62,210,211],{"class":68}," sum;\n",[62,213,214],{"class":64,"line":96},[62,215,110],{"class":68},[18,217,218,116],{},[48,219,115],{},[14,221,222],{"id":222},"函数的调用",[18,224,225],{},"**功能：**使用定义好的函数",[18,227,228,230],{},[48,229,50],{},[59,231,232],{}," 函数名（参数）",[18,234,235],{},[48,236,237],{},"示例：",[52,239,241],{"className":54,"code":240,"language":56,"meta":57,"style":57},"\u002F\u002F函数定义\nint add(int num1, int num2) \u002F\u002F定义中的num1,num2称为形式参数，简称形参\n{\n    int sum = num1 + num2;\n    return sum;\n}\n\nint main() {\n\n    int a = 10;\n    int b = 10;\n    \u002F\u002F调用add函数\n    int sum = add(a, b);\u002F\u002F调用时的a，b称为实际参数，简称实参\n    cout \u003C\u003C \"sum = \" \u003C\u003C sum \u003C\u003C endl;\n\n    a = 100;\n    b = 100;\n\n    sum = add(a, b);\n    cout \u003C\u003C \"sum = \" \u003C\u003C sum \u003C\u003C endl;\n\n\n    return 0;\n}\n",[59,242,243,247,271,275,289,295,299,303,313,318,335,349,355,372,395,400,413,425,430,443,460,465,470,480],{"__ignoreMap":57},[62,244,245],{"class":64,"line":65},[62,246,149],{"class":148},[62,248,249,251,253,255,257,259,261,263,265,268],{"class":64,"line":72},[62,250,155],{"class":154},[62,252,159],{"class":158},[62,254,162],{"class":68},[62,256,155],{"class":154},[62,258,168],{"class":167},[62,260,171],{"class":68},[62,262,155],{"class":154},[62,264,176],{"class":167},[62,266,267],{"class":68},")",[62,269,270],{"class":148}," \u002F\u002F定义中的num1,num2称为形式参数，简称形参\n",[62,272,273],{"class":64,"line":78},[62,274,75],{"class":68},[62,276,277,279,281,283,285,287],{"class":64,"line":85},[62,278,188],{"class":154},[62,280,191],{"class":68},[62,282,194],{"class":154},[62,284,197],{"class":68},[62,286,200],{"class":154},[62,288,203],{"class":68},[62,290,291,293],{"class":64,"line":91},[62,292,208],{"class":154},[62,294,211],{"class":68},[62,296,297],{"class":64,"line":96},[62,298,110],{"class":68},[62,300,301],{"class":64,"line":102},[62,302,82],{"emptyLinePlaceholder":81},[62,304,305,307,310],{"class":64,"line":107},[62,306,155],{"class":154},[62,308,309],{"class":158}," main",[62,311,312],{"class":68},"() {\n",[62,314,316],{"class":64,"line":315},9,[62,317,82],{"emptyLinePlaceholder":81},[62,319,321,323,326,328,332],{"class":64,"line":320},10,[62,322,188],{"class":154},[62,324,325],{"class":68}," a ",[62,327,194],{"class":154},[62,329,331],{"class":330},"sj4cs"," 10",[62,333,334],{"class":68},";\n",[62,336,338,340,343,345,347],{"class":64,"line":337},11,[62,339,188],{"class":154},[62,341,342],{"class":68}," b ",[62,344,194],{"class":154},[62,346,331],{"class":330},[62,348,334],{"class":68},[62,350,352],{"class":64,"line":351},12,[62,353,354],{"class":148},"    \u002F\u002F调用add函数\n",[62,356,358,360,362,364,366,369],{"class":64,"line":357},13,[62,359,188],{"class":154},[62,361,191],{"class":68},[62,363,194],{"class":154},[62,365,159],{"class":158},[62,367,368],{"class":68},"(a, b);",[62,370,371],{"class":148},"\u002F\u002F调用时的a，b称为实际参数，简称实参\n",[62,373,375,378,381,385,388,390,392],{"class":64,"line":374},14,[62,376,377],{"class":68},"    cout ",[62,379,380],{"class":154},"\u003C\u003C",[62,382,384],{"class":383},"sZZnC"," \"sum = \"",[62,386,387],{"class":154}," \u003C\u003C",[62,389,191],{"class":68},[62,391,380],{"class":154},[62,393,394],{"class":68}," endl;\n",[62,396,398],{"class":64,"line":397},15,[62,399,82],{"emptyLinePlaceholder":81},[62,401,403,406,408,411],{"class":64,"line":402},16,[62,404,405],{"class":68},"    a ",[62,407,194],{"class":154},[62,409,410],{"class":330}," 100",[62,412,334],{"class":68},[62,414,416,419,421,423],{"class":64,"line":415},17,[62,417,418],{"class":68},"    b ",[62,420,194],{"class":154},[62,422,410],{"class":330},[62,424,334],{"class":68},[62,426,428],{"class":64,"line":427},18,[62,429,82],{"emptyLinePlaceholder":81},[62,431,433,436,438,440],{"class":64,"line":432},19,[62,434,435],{"class":68},"    sum ",[62,437,194],{"class":154},[62,439,159],{"class":158},[62,441,442],{"class":68},"(a, b);\n",[62,444,446,448,450,452,454,456,458],{"class":64,"line":445},20,[62,447,377],{"class":68},[62,449,380],{"class":154},[62,451,384],{"class":383},[62,453,387],{"class":154},[62,455,191],{"class":68},[62,457,380],{"class":154},[62,459,394],{"class":68},[62,461,463],{"class":64,"line":462},21,[62,464,82],{"emptyLinePlaceholder":81},[62,466,468],{"class":64,"line":467},22,[62,469,82],{"emptyLinePlaceholder":81},[62,471,473,475,478],{"class":64,"line":472},23,[62,474,208],{"class":154},[62,476,477],{"class":330}," 0",[62,479,334],{"class":68},[62,481,483],{"class":64,"line":482},24,[62,484,110],{"class":68},[18,486,487,489],{},[48,488,115],{}," 运行后会按输出语句打印对应内容，变量值可结合初始化、赋值和函数调用顺序推导。",[491,492,493],"blockquote",{},[18,494,495],{},"总结：函数定义里小括号内称为形参，函数调用时传入的参数称为实参",[14,497,498],{"id":498},"值传递",[118,500,501,504],{},[121,502,503],{},"所谓值传递，就是函数调用时实参将数值传入给形参",[121,505,506],{},"值传递时，==如果形参发生，并不会影响实参==",[18,508,509],{},[48,510,237],{},[52,512,514],{"className":54,"code":513,"language":56,"meta":57,"style":57},"void swap(int num1, int num2)\n{\n    cout \u003C\u003C \"交换前：\" \u003C\u003C endl;\n    cout \u003C\u003C \"num1 = \" \u003C\u003C num1 \u003C\u003C endl;\n    cout \u003C\u003C \"num2 = \" \u003C\u003C num2 \u003C\u003C endl;\n\n    int temp = num1;\n    num1 = num2;\n    num2 = temp;\n\n    cout \u003C\u003C \"交换后：\" \u003C\u003C endl;\n    cout \u003C\u003C \"num1 = \" \u003C\u003C num1 \u003C\u003C endl;\n    cout \u003C\u003C \"num2 = \" \u003C\u003C num2 \u003C\u003C endl;\n\n    \u002F\u002Freturn ; 当函数声明时候，不需要返回值，可以不写return\n}\n\nint main() {\n\n    int a = 10;\n    int b = 20;\n\n    swap(a, b);\n\n    cout \u003C\u003C \"mian中的 a = \" \u003C\u003C a \u003C\u003C endl;\n    cout \u003C\u003C \"mian中的 b = \" \u003C\u003C b \u003C\u003C endl;\n\n\n    return 0;\n}\n",[59,515,516,538,542,555,572,590,594,606,615,625,629,642,658,674,678,683,687,691,699,703,715,728,732,739,743,761,779,784,789,798],{"__ignoreMap":57},[62,517,518,521,524,526,528,530,532,534,536],{"class":64,"line":65},[62,519,520],{"class":154},"void",[62,522,523],{"class":158}," swap",[62,525,162],{"class":68},[62,527,155],{"class":154},[62,529,168],{"class":167},[62,531,171],{"class":68},[62,533,155],{"class":154},[62,535,176],{"class":167},[62,537,179],{"class":68},[62,539,540],{"class":64,"line":72},[62,541,75],{"class":68},[62,543,544,546,548,551,553],{"class":64,"line":78},[62,545,377],{"class":68},[62,547,380],{"class":154},[62,549,550],{"class":383}," \"交换前：\"",[62,552,387],{"class":154},[62,554,394],{"class":68},[62,556,557,559,561,564,566,568,570],{"class":64,"line":85},[62,558,377],{"class":68},[62,560,380],{"class":154},[62,562,563],{"class":383}," \"num1 = \"",[62,565,387],{"class":154},[62,567,197],{"class":68},[62,569,380],{"class":154},[62,571,394],{"class":68},[62,573,574,576,578,581,583,586,588],{"class":64,"line":91},[62,575,377],{"class":68},[62,577,380],{"class":154},[62,579,580],{"class":383}," \"num2 = \"",[62,582,387],{"class":154},[62,584,585],{"class":68}," num2 ",[62,587,380],{"class":154},[62,589,394],{"class":68},[62,591,592],{"class":64,"line":96},[62,593,82],{"emptyLinePlaceholder":81},[62,595,596,598,601,603],{"class":64,"line":102},[62,597,188],{"class":154},[62,599,600],{"class":68}," temp ",[62,602,194],{"class":154},[62,604,605],{"class":68}," num1;\n",[62,607,608,611,613],{"class":64,"line":107},[62,609,610],{"class":68},"    num1 ",[62,612,194],{"class":154},[62,614,203],{"class":68},[62,616,617,620,622],{"class":64,"line":315},[62,618,619],{"class":68},"    num2 ",[62,621,194],{"class":154},[62,623,624],{"class":68}," temp;\n",[62,626,627],{"class":64,"line":320},[62,628,82],{"emptyLinePlaceholder":81},[62,630,631,633,635,638,640],{"class":64,"line":337},[62,632,377],{"class":68},[62,634,380],{"class":154},[62,636,637],{"class":383}," \"交换后：\"",[62,639,387],{"class":154},[62,641,394],{"class":68},[62,643,644,646,648,650,652,654,656],{"class":64,"line":351},[62,645,377],{"class":68},[62,647,380],{"class":154},[62,649,563],{"class":383},[62,651,387],{"class":154},[62,653,197],{"class":68},[62,655,380],{"class":154},[62,657,394],{"class":68},[62,659,660,662,664,666,668,670,672],{"class":64,"line":357},[62,661,377],{"class":68},[62,663,380],{"class":154},[62,665,580],{"class":383},[62,667,387],{"class":154},[62,669,585],{"class":68},[62,671,380],{"class":154},[62,673,394],{"class":68},[62,675,676],{"class":64,"line":374},[62,677,82],{"emptyLinePlaceholder":81},[62,679,680],{"class":64,"line":397},[62,681,682],{"class":148},"    \u002F\u002Freturn ; 当函数声明时候，不需要返回值，可以不写return\n",[62,684,685],{"class":64,"line":402},[62,686,110],{"class":68},[62,688,689],{"class":64,"line":415},[62,690,82],{"emptyLinePlaceholder":81},[62,692,693,695,697],{"class":64,"line":427},[62,694,155],{"class":154},[62,696,309],{"class":158},[62,698,312],{"class":68},[62,700,701],{"class":64,"line":432},[62,702,82],{"emptyLinePlaceholder":81},[62,704,705,707,709,711,713],{"class":64,"line":445},[62,706,188],{"class":154},[62,708,325],{"class":68},[62,710,194],{"class":154},[62,712,331],{"class":330},[62,714,334],{"class":68},[62,716,717,719,721,723,726],{"class":64,"line":462},[62,718,188],{"class":154},[62,720,342],{"class":68},[62,722,194],{"class":154},[62,724,725],{"class":330}," 20",[62,727,334],{"class":68},[62,729,730],{"class":64,"line":467},[62,731,82],{"emptyLinePlaceholder":81},[62,733,734,737],{"class":64,"line":472},[62,735,736],{"class":158},"    swap",[62,738,442],{"class":68},[62,740,741],{"class":64,"line":482},[62,742,82],{"emptyLinePlaceholder":81},[62,744,746,748,750,753,755,757,759],{"class":64,"line":745},25,[62,747,377],{"class":68},[62,749,380],{"class":154},[62,751,752],{"class":383}," \"mian中的 a = \"",[62,754,387],{"class":154},[62,756,325],{"class":68},[62,758,380],{"class":154},[62,760,394],{"class":68},[62,762,764,766,768,771,773,775,777],{"class":64,"line":763},26,[62,765,377],{"class":68},[62,767,380],{"class":154},[62,769,770],{"class":383}," \"mian中的 b = \"",[62,772,387],{"class":154},[62,774,342],{"class":68},[62,776,380],{"class":154},[62,778,394],{"class":68},[62,780,782],{"class":64,"line":781},27,[62,783,82],{"emptyLinePlaceholder":81},[62,785,787],{"class":64,"line":786},28,[62,788,82],{"emptyLinePlaceholder":81},[62,790,792,794,796],{"class":64,"line":791},29,[62,793,208],{"class":154},[62,795,477],{"class":330},[62,797,334],{"class":68},[62,799,801],{"class":64,"line":800},30,[62,802,110],{"class":68},[18,804,805,489],{},[48,806,115],{},[491,808,809],{},[18,810,811],{},"总结： 值传递时，形参是修饰不了实参的",[14,813,815],{"id":814},"函数的常见样式",[48,816,814],{},[18,818,819],{},"常见的函数样式有4种",[821,822,823,826,829,832],"ol",{},[121,824,825],{},"无参无返",[121,827,828],{},"有参无返",[121,830,831],{},"无参有返",[121,833,834],{},"有参有返",[18,836,837],{},[48,838,237],{},[52,840,842],{"className":54,"code":841,"language":56,"meta":57,"style":57},"\u002F\u002F函数常见样式\n\u002F\u002F1、 无参无返\nvoid test01()\n{\n    \u002F\u002Fvoid a = 10; \u002F\u002F无类型不可以创建变量,原因无法分配内存\n    cout \u003C\u003C \"this is test01\" \u003C\u003C endl;\n    \u002F\u002Ftest01(); 函数调用\n}\n\n\u002F\u002F2、 有参无返\nvoid test02(int a)\n{\n    cout \u003C\u003C \"this is test02\" \u003C\u003C endl;\n    cout \u003C\u003C \"a = \" \u003C\u003C a \u003C\u003C endl;\n}\n\n\u002F\u002F3、无参有返\nint test03()\n{\n    cout \u003C\u003C \"this is test03 \" \u003C\u003C endl;\n    return 10;\n}\n\n\u002F\u002F4、有参有返\nint test04(int a, int b)\n{\n    cout \u003C\u003C \"this is test04 \" \u003C\u003C endl;\n    int sum = a + b;\n    return sum;\n}\n",[59,843,844,849,854,864,868,876,889,894,898,902,907,923,927,940,957,961,965,970,979,983,996,1004,1008,1012,1017,1039,1043,1056,1071,1077],{"__ignoreMap":57},[62,845,846],{"class":64,"line":65},[62,847,848],{"class":148},"\u002F\u002F函数常见样式\n",[62,850,851],{"class":64,"line":72},[62,852,853],{"class":148},"\u002F\u002F1、 无参无返\n",[62,855,856,858,861],{"class":64,"line":78},[62,857,520],{"class":154},[62,859,860],{"class":158}," test01",[62,862,863],{"class":68},"()\n",[62,865,866],{"class":64,"line":85},[62,867,75],{"class":68},[62,869,870,873],{"class":64,"line":91},[62,871,872],{"class":148},"    \u002F\u002Fvoid a = 10;",[62,874,875],{"class":148}," \u002F\u002F无类型不可以创建变量,原因无法分配内存\n",[62,877,878,880,882,885,887],{"class":64,"line":96},[62,879,377],{"class":68},[62,881,380],{"class":154},[62,883,884],{"class":383}," \"this is test01\"",[62,886,387],{"class":154},[62,888,394],{"class":68},[62,890,891],{"class":64,"line":102},[62,892,893],{"class":148},"    \u002F\u002Ftest01(); 函数调用\n",[62,895,896],{"class":64,"line":107},[62,897,110],{"class":68},[62,899,900],{"class":64,"line":315},[62,901,82],{"emptyLinePlaceholder":81},[62,903,904],{"class":64,"line":320},[62,905,906],{"class":148},"\u002F\u002F2、 有参无返\n",[62,908,909,911,914,916,918,921],{"class":64,"line":337},[62,910,520],{"class":154},[62,912,913],{"class":158}," test02",[62,915,162],{"class":68},[62,917,155],{"class":154},[62,919,920],{"class":167}," a",[62,922,179],{"class":68},[62,924,925],{"class":64,"line":351},[62,926,75],{"class":68},[62,928,929,931,933,936,938],{"class":64,"line":357},[62,930,377],{"class":68},[62,932,380],{"class":154},[62,934,935],{"class":383}," \"this is test02\"",[62,937,387],{"class":154},[62,939,394],{"class":68},[62,941,942,944,946,949,951,953,955],{"class":64,"line":374},[62,943,377],{"class":68},[62,945,380],{"class":154},[62,947,948],{"class":383}," \"a = \"",[62,950,387],{"class":154},[62,952,325],{"class":68},[62,954,380],{"class":154},[62,956,394],{"class":68},[62,958,959],{"class":64,"line":397},[62,960,110],{"class":68},[62,962,963],{"class":64,"line":402},[62,964,82],{"emptyLinePlaceholder":81},[62,966,967],{"class":64,"line":415},[62,968,969],{"class":148},"\u002F\u002F3、无参有返\n",[62,971,972,974,977],{"class":64,"line":427},[62,973,155],{"class":154},[62,975,976],{"class":158}," test03",[62,978,863],{"class":68},[62,980,981],{"class":64,"line":432},[62,982,75],{"class":68},[62,984,985,987,989,992,994],{"class":64,"line":445},[62,986,377],{"class":68},[62,988,380],{"class":154},[62,990,991],{"class":383}," \"this is test03 \"",[62,993,387],{"class":154},[62,995,394],{"class":68},[62,997,998,1000,1002],{"class":64,"line":462},[62,999,208],{"class":154},[62,1001,331],{"class":330},[62,1003,334],{"class":68},[62,1005,1006],{"class":64,"line":467},[62,1007,110],{"class":68},[62,1009,1010],{"class":64,"line":472},[62,1011,82],{"emptyLinePlaceholder":81},[62,1013,1014],{"class":64,"line":482},[62,1015,1016],{"class":148},"\u002F\u002F4、有参有返\n",[62,1018,1019,1021,1024,1026,1028,1030,1032,1034,1037],{"class":64,"line":745},[62,1020,155],{"class":154},[62,1022,1023],{"class":158}," test04",[62,1025,162],{"class":68},[62,1027,155],{"class":154},[62,1029,920],{"class":167},[62,1031,171],{"class":68},[62,1033,155],{"class":154},[62,1035,1036],{"class":167}," b",[62,1038,179],{"class":68},[62,1040,1041],{"class":64,"line":763},[62,1042,75],{"class":68},[62,1044,1045,1047,1049,1052,1054],{"class":64,"line":781},[62,1046,377],{"class":68},[62,1048,380],{"class":154},[62,1050,1051],{"class":383}," \"this is test04 \"",[62,1053,387],{"class":154},[62,1055,394],{"class":68},[62,1057,1058,1060,1062,1064,1066,1068],{"class":64,"line":786},[62,1059,188],{"class":154},[62,1061,191],{"class":68},[62,1063,194],{"class":154},[62,1065,325],{"class":68},[62,1067,200],{"class":154},[62,1069,1070],{"class":68}," b;\n",[62,1072,1073,1075],{"class":64,"line":791},[62,1074,208],{"class":154},[62,1076,211],{"class":68},[62,1078,1079],{"class":64,"line":800},[62,1080,110],{"class":68},[18,1082,1083,1085],{},[48,1084,115],{}," 运行后会打印示例中的变量值或地址；地址值与运行环境有关，以同类对象的相对位置和指针变化为观察重点。",[14,1087,1088],{"id":1088},"函数的声明",[18,1090,1091,1094],{},[48,1092,1093],{},"作用："," 告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。",[118,1096,1097],{},[121,1098,1099,1100,1103,1104],{},"函数的",[48,1101,1102],{},"声明可以多次","，但是函数的",[48,1105,1106],{},"定义只能有一次",[18,1108,1109],{},[48,1110,237],{},[52,1112,1114],{"className":54,"code":1113,"language":56,"meta":57,"style":57},"\u002F\u002F声明可以多次，定义只能一次\n\u002F\u002F声明\nint max(int a, int b);\nint max(int a, int b);\n\u002F\u002F定义\nint max(int a, int b)\n{\n    return a > b ? a : b;\n}\n\nint main() {\n\n    int a = 100;\n    int b = 200;\n\n    cout \u003C\u003C max(a, b) \u003C\u003C endl;\n\n\n    return 0;\n}\n",[59,1115,1116,1121,1126,1148,1168,1173,1193,1197,1218,1222,1226,1234,1238,1250,1263,1267,1282,1286,1290,1298],{"__ignoreMap":57},[62,1117,1118],{"class":64,"line":65},[62,1119,1120],{"class":148},"\u002F\u002F声明可以多次，定义只能一次\n",[62,1122,1123],{"class":64,"line":72},[62,1124,1125],{"class":148},"\u002F\u002F声明\n",[62,1127,1128,1130,1133,1135,1137,1139,1141,1143,1145],{"class":64,"line":78},[62,1129,155],{"class":154},[62,1131,1132],{"class":158}," max",[62,1134,162],{"class":68},[62,1136,155],{"class":154},[62,1138,920],{"class":167},[62,1140,171],{"class":68},[62,1142,155],{"class":154},[62,1144,1036],{"class":167},[62,1146,1147],{"class":68},");\n",[62,1149,1150,1152,1154,1156,1158,1160,1162,1164,1166],{"class":64,"line":85},[62,1151,155],{"class":154},[62,1153,1132],{"class":158},[62,1155,162],{"class":68},[62,1157,155],{"class":154},[62,1159,920],{"class":167},[62,1161,171],{"class":68},[62,1163,155],{"class":154},[62,1165,1036],{"class":167},[62,1167,1147],{"class":68},[62,1169,1170],{"class":64,"line":91},[62,1171,1172],{"class":148},"\u002F\u002F定义\n",[62,1174,1175,1177,1179,1181,1183,1185,1187,1189,1191],{"class":64,"line":96},[62,1176,155],{"class":154},[62,1178,1132],{"class":158},[62,1180,162],{"class":68},[62,1182,155],{"class":154},[62,1184,920],{"class":167},[62,1186,171],{"class":68},[62,1188,155],{"class":154},[62,1190,1036],{"class":167},[62,1192,179],{"class":68},[62,1194,1195],{"class":64,"line":102},[62,1196,75],{"class":68},[62,1198,1199,1201,1203,1206,1208,1211,1213,1216],{"class":64,"line":107},[62,1200,208],{"class":154},[62,1202,325],{"class":68},[62,1204,1205],{"class":154},">",[62,1207,342],{"class":68},[62,1209,1210],{"class":154},"?",[62,1212,325],{"class":68},[62,1214,1215],{"class":154},":",[62,1217,1070],{"class":68},[62,1219,1220],{"class":64,"line":315},[62,1221,110],{"class":68},[62,1223,1224],{"class":64,"line":320},[62,1225,82],{"emptyLinePlaceholder":81},[62,1227,1228,1230,1232],{"class":64,"line":337},[62,1229,155],{"class":154},[62,1231,309],{"class":158},[62,1233,312],{"class":68},[62,1235,1236],{"class":64,"line":351},[62,1237,82],{"emptyLinePlaceholder":81},[62,1239,1240,1242,1244,1246,1248],{"class":64,"line":357},[62,1241,188],{"class":154},[62,1243,325],{"class":68},[62,1245,194],{"class":154},[62,1247,410],{"class":330},[62,1249,334],{"class":68},[62,1251,1252,1254,1256,1258,1261],{"class":64,"line":374},[62,1253,188],{"class":154},[62,1255,342],{"class":68},[62,1257,194],{"class":154},[62,1259,1260],{"class":330}," 200",[62,1262,334],{"class":68},[62,1264,1265],{"class":64,"line":397},[62,1266,82],{"emptyLinePlaceholder":81},[62,1268,1269,1271,1273,1275,1278,1280],{"class":64,"line":402},[62,1270,377],{"class":68},[62,1272,380],{"class":154},[62,1274,1132],{"class":158},[62,1276,1277],{"class":68},"(a, b) ",[62,1279,380],{"class":154},[62,1281,394],{"class":68},[62,1283,1284],{"class":64,"line":415},[62,1285,82],{"emptyLinePlaceholder":81},[62,1287,1288],{"class":64,"line":427},[62,1289,82],{"emptyLinePlaceholder":81},[62,1291,1292,1294,1296],{"class":64,"line":432},[62,1293,208],{"class":154},[62,1295,477],{"class":330},[62,1297,334],{"class":68},[62,1299,1300],{"class":64,"line":445},[62,1301,110],{"class":68},[18,1303,1304,489],{},[48,1305,115],{},[14,1307,1308],{"id":1308},"函数的分文件编写",[18,1310,1311],{},"**作用：**让代码结构更加清晰",[18,1313,1314,1315,1318],{},"前面几章我们主要在 ",[59,1316,1317],{},"src\u002Fmain.cpp"," 里写代码。这样适合学习语法，但是程序稍微大一点，就会变得很乱。",[18,1320,1321],{},"函数的分文件编写，就是把代码拆成：",[821,1323,1324,1331,1338],{},[121,1325,1326,1327,1330],{},"头文件 ",[59,1328,1329],{},".h","：写函数声明。",[121,1332,1333,1334,1337],{},"源文件 ",[59,1335,1336],{},".cpp","：写函数定义。",[121,1339,1340,1343],{},[59,1341,1342],{},"main.cpp","：调用函数。",[18,1345,1346,1347,1352],{},"从 ",[1348,1349,1351],"a",{"href":1350},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","C++开发环境与第一个工程"," 开始，本教程一直使用同一个 CMake 模板。写到这里时，你的工程大致还是这个结构：",[52,1354,1359],{"className":1355,"code":1357,"language":1358,"meta":57},[1356],"language-text","src\u002F\n├── CMakeLists.txt\n├── main.cpp\n├── lib1\u002F\n│   ├── CMakeLists.txt\n│   ├── inc\u002Flib1\u002Feigen3_test.hpp\n│   └── src\u002Feigen3_test.cpp\n└── lib2\u002F\n    ├── CMakeLists.txt\n    ├── inc\u002Flib2\u002Feigen3_test.hpp\n    └── src\u002Feigen3_test.cpp\n","text",[59,1360,1357],{"__ignoreMap":57},[18,1362,1363,1366,1367,1370,1371,1373,1374,1376,1377,1380,1381,1366,1384,1387],{},[59,1364,1365],{},"lib1"," 和 ",[59,1368,1369],{},"lib2"," 是模板自带的两个示例库。本节第一次整理它们：删掉暂时用不到的 ",[59,1372,1369],{},"，把 ",[59,1375,1365],{}," 改成我们自己的 ",[59,1378,1379],{},"swap"," 小库，再把模板自带的示例头文件和源文件分别重命名为 ",[59,1382,1383],{},"swap.h",[59,1385,1386],{},"swap.cpp","，用它们完成本节的函数分文件编写示例。",[18,1389,1390],{},"改完之后，目录结构变成：",[52,1392,1395],{"className":1393,"code":1394,"language":1358,"meta":57},[1356],"src\u002F\n├── CMakeLists.txt\n├── main.cpp\n└── swap\u002F\n    ├── CMakeLists.txt\n    ├── inc\u002Fswap\u002Fswap.h\n    └── src\u002Fswap.cpp\n",[59,1396,1394],{"__ignoreMap":57},[18,1398,1399],{},"也就是说：",[821,1401,1402,1408,1416,1431],{},[121,1403,1404,1405,1407],{},"删除本例暂时用不到的 ",[59,1406,1369],{},"。",[121,1409,1410,1411,1413,1414,1407],{},"把 ",[59,1412,1365],{}," 目录重命名为 ",[59,1415,1379],{},[121,1417,1410,1418,1413,1421,1424,1425,1428,1429,1407],{},[59,1419,1420],{},"inc\u002Flib1",[59,1422,1423],{},"inc\u002Fswap","，再把其中的 ",[59,1426,1427],{},"eigen3_test.hpp"," 重命名为 ",[59,1430,1383],{},[121,1432,1410,1433,1428,1436,1407],{},[59,1434,1435],{},"src\u002Feigen3_test.cpp",[59,1437,1438],{},"src\u002Fswap.cpp",[1440,1441,1443],"h4",{"id":1442},"整理-lib1-和-lib2","整理 lib1 和 lib2",[18,1445,1446,1447,1449],{},"首先删除掉",[59,1448,1369],{},",这里不需要.",[18,1451,1452],{},[1453,1454],"img",{"alt":1455,"src":1456},"alt text","https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1780712796407.webp",[821,1458,1459,1465,1475],{},[121,1460,1410,1461,1413,1463,1215],{},[59,1462,1365],{},[59,1464,1379],{},[121,1466,1410,1467,1413,1469,1424,1471,1428,1473,1215],{},[59,1468,1420],{},[59,1470,1423],{},[59,1472,1427],{},[59,1474,1383],{},[121,1476,1410,1477,1428,1479,1215],{},[59,1478,1435],{},[59,1480,1438],{},[18,1482,1483],{},[1453,1484],{"alt":1455,"src":1485},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1780712918093.webp",[1440,1487,1489],{"id":1488},"修改-swaph","修改 swap.h",[18,1491,1492],{},"打开：",[52,1494,1497],{"className":1495,"code":1496,"language":1358,"meta":57},[1356],"src\u002Fswap\u002Finc\u002Fswap\u002Fswap.h\n",[59,1498,1496],{"__ignoreMap":57},[18,1500,1501],{},"写入：",[52,1503,1505],{"className":54,"code":1504,"language":56,"meta":57,"style":57},"#include\u003Ciostream>\nusing namespace std;\n\nvoid swap(int a, int b);\n",[59,1506,1507,1515,1528,1532],{"__ignoreMap":57},[62,1508,1509,1512],{"class":64,"line":65},[62,1510,1511],{"class":154},"#include",[62,1513,1514],{"class":383},"\u003Ciostream>\n",[62,1516,1517,1520,1523,1526],{"class":64,"line":72},[62,1518,1519],{"class":154},"using",[62,1521,1522],{"class":154}," namespace",[62,1524,1525],{"class":158}," std",[62,1527,334],{"class":68},[62,1529,1530],{"class":64,"line":78},[62,1531,82],{"emptyLinePlaceholder":81},[62,1533,1534,1536,1538,1540,1542,1544,1546,1548,1550],{"class":64,"line":85},[62,1535,520],{"class":154},[62,1537,523],{"class":158},[62,1539,162],{"class":68},[62,1541,155],{"class":154},[62,1543,920],{"class":167},[62,1545,171],{"class":68},[62,1547,155],{"class":154},[62,1549,1036],{"class":167},[62,1551,1147],{"class":68},[18,1553,1554],{},[1453,1555],{"alt":1455,"src":1556},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1780713074486.webp",[18,1558,1559,1560,1562,1563,1565,1566,1568],{},"这是我们第一次把函数声明单独放进头文件。",[59,1561,1383],{}," 只负责告诉其他源文件：工程中存在一个名为 ",[59,1564,1379],{},"、接收两个 ",[59,1567,155],{}," 参数的函数。",[491,1570,1571],{},[18,1572,1573,1574,1577,1578,1580,1581,1584],{},"补充说明：真实工程里通常不建议在头文件中写 ",[59,1575,1576],{},"using namespace std;","，函数名也尽量避免直接叫 ",[59,1579,1379],{},"，因为标准库里有 ",[59,1582,1583],{},"std::swap","。不过这里先专心理解\"头文件声明、源文件定义、主函数调用\"这条线，因此暂时使用这份简单的教学代码。",[1440,1586,1588],{"id":1587},"修改-swapcpp","修改 swap.cpp",[18,1590,1492],{},[52,1592,1595],{"className":1593,"code":1594,"language":1358,"meta":57},[1356],"src\u002Fswap\u002Fsrc\u002Fswap.cpp\n",[59,1596,1594],{"__ignoreMap":57},[18,1598,1501],{},[52,1600,1602],{"className":54,"code":1601,"language":56,"meta":57,"style":57},"#include \"swap\u002Fswap.h\"\n\nvoid swap(int a, int b)\n{\n    int temp = a;\n    a = b;\n    b = temp;\n\n    cout \u003C\u003C \"a = \" \u003C\u003C a \u003C\u003C endl;\n    cout \u003C\u003C \"b = \" \u003C\u003C b \u003C\u003C endl;\n}\n",[59,1603,1604,1611,1615,1635,1639,1650,1658,1666,1670,1686,1703],{"__ignoreMap":57},[62,1605,1606,1608],{"class":64,"line":65},[62,1607,1511],{"class":154},[62,1609,1610],{"class":383}," \"swap\u002Fswap.h\"\n",[62,1612,1613],{"class":64,"line":72},[62,1614,82],{"emptyLinePlaceholder":81},[62,1616,1617,1619,1621,1623,1625,1627,1629,1631,1633],{"class":64,"line":78},[62,1618,520],{"class":154},[62,1620,523],{"class":158},[62,1622,162],{"class":68},[62,1624,155],{"class":154},[62,1626,920],{"class":167},[62,1628,171],{"class":68},[62,1630,155],{"class":154},[62,1632,1036],{"class":167},[62,1634,179],{"class":68},[62,1636,1637],{"class":64,"line":85},[62,1638,75],{"class":68},[62,1640,1641,1643,1645,1647],{"class":64,"line":91},[62,1642,188],{"class":154},[62,1644,600],{"class":68},[62,1646,194],{"class":154},[62,1648,1649],{"class":68}," a;\n",[62,1651,1652,1654,1656],{"class":64,"line":96},[62,1653,405],{"class":68},[62,1655,194],{"class":154},[62,1657,1070],{"class":68},[62,1659,1660,1662,1664],{"class":64,"line":102},[62,1661,418],{"class":68},[62,1663,194],{"class":154},[62,1665,624],{"class":68},[62,1667,1668],{"class":64,"line":107},[62,1669,82],{"emptyLinePlaceholder":81},[62,1671,1672,1674,1676,1678,1680,1682,1684],{"class":64,"line":315},[62,1673,377],{"class":68},[62,1675,380],{"class":154},[62,1677,948],{"class":383},[62,1679,387],{"class":154},[62,1681,325],{"class":68},[62,1683,380],{"class":154},[62,1685,394],{"class":68},[62,1687,1688,1690,1692,1695,1697,1699,1701],{"class":64,"line":320},[62,1689,377],{"class":68},[62,1691,380],{"class":154},[62,1693,1694],{"class":383}," \"b = \"",[62,1696,387],{"class":154},[62,1698,342],{"class":68},[62,1700,380],{"class":154},[62,1702,394],{"class":68},[62,1704,1705],{"class":64,"line":337},[62,1706,110],{"class":68},[18,1708,1709],{},[1453,1710],{"alt":1455,"src":1711},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1780713085999.webp",[18,1713,1714,1715,1718,1719,1721],{},"这里的 ",[59,1716,1717],{},"#include \"swap\u002Fswap.h\""," 表示：",[59,1720,1386],{}," 要先看到函数声明，再提供函数定义。",[18,1723,1724,1725,1728,1729,1732],{},"这时候有VScode的报错无所谓,是因为",[59,1726,1727],{},"CMakeLists","没修改,其次",[59,1730,1731],{},"clangd","也没有被刷新,先不用管代码提示的报错.",[1440,1734,1736],{"id":1735},"修改-maincpp","修改 main.cpp",[18,1738,1492],{},[52,1740,1743],{"className":1741,"code":1742,"language":1358,"meta":57},[1356],"src\u002Fmain.cpp\n",[59,1744,1742],{"__ignoreMap":57},[18,1746,1501],{},[52,1748,1750],{"className":54,"code":1749,"language":56,"meta":57,"style":57},"#include \"swap\u002Fswap.h\"\n\nint main()\n{\n    int a = 100;\n    int b = 200;\n\n    swap(a, b);\n\n    return 0;\n}\n",[59,1751,1752,1758,1762,1770,1774,1786,1798,1802,1808,1812,1820],{"__ignoreMap":57},[62,1753,1754,1756],{"class":64,"line":65},[62,1755,1511],{"class":154},[62,1757,1610],{"class":383},[62,1759,1760],{"class":64,"line":72},[62,1761,82],{"emptyLinePlaceholder":81},[62,1763,1764,1766,1768],{"class":64,"line":78},[62,1765,155],{"class":154},[62,1767,309],{"class":158},[62,1769,863],{"class":68},[62,1771,1772],{"class":64,"line":85},[62,1773,75],{"class":68},[62,1775,1776,1778,1780,1782,1784],{"class":64,"line":91},[62,1777,188],{"class":154},[62,1779,325],{"class":68},[62,1781,194],{"class":154},[62,1783,410],{"class":330},[62,1785,334],{"class":68},[62,1787,1788,1790,1792,1794,1796],{"class":64,"line":96},[62,1789,188],{"class":154},[62,1791,342],{"class":68},[62,1793,194],{"class":154},[62,1795,1260],{"class":330},[62,1797,334],{"class":68},[62,1799,1800],{"class":64,"line":102},[62,1801,82],{"emptyLinePlaceholder":81},[62,1803,1804,1806],{"class":64,"line":107},[62,1805,736],{"class":158},[62,1807,442],{"class":68},[62,1809,1810],{"class":64,"line":315},[62,1811,82],{"emptyLinePlaceholder":81},[62,1813,1814,1816,1818],{"class":64,"line":320},[62,1815,208],{"class":154},[62,1817,477],{"class":330},[62,1819,334],{"class":68},[62,1821,1822],{"class":64,"line":337},[62,1823,110],{"class":68},[18,1825,1826],{},[1453,1827],{"alt":1455,"src":1828},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1780713106888.webp",[18,1830,1831,1833,1834,1836],{},[59,1832,1342],{}," 只负责调用函数，不再把 ",[59,1835,1379],{}," 函数的具体实现写在自己里面。",[1440,1838,1840],{"id":1839},"修改-srcswapcmakeliststxt","修改 src\u002Fswap\u002FCMakeLists.txt",[18,1842,1492],{},[52,1844,1847],{"className":1845,"code":1846,"language":1358,"meta":57},[1356],"src\u002Fswap\u002FCMakeLists.txt\n",[59,1848,1846],{"__ignoreMap":57},[18,1850,1851,1852,1854,1855,1857],{},"这个文件原来来自 ",[59,1853,1365],{},"，所以里面还有 ",[59,1856,1365],{}," 和 Eigen 示例的痕迹。",[18,1859,1860],{},"先把第一行从：",[52,1862,1866],{"className":1863,"code":1864,"language":1865,"meta":57,"style":57},"language-cmake shiki shiki-themes github-light github-dark","set(PREFIX \"lib1\")\n","cmake",[59,1867,1868],{"__ignoreMap":57},[62,1869,1870,1873,1875,1878,1881],{"class":64,"line":65},[62,1871,1872],{"class":154},"set",[62,1874,162],{"class":68},[62,1876,1877],{"class":158},"PREFIX",[62,1879,1880],{"class":383}," \"lib1\"",[62,1882,179],{"class":68},[18,1884,1885],{},"改成：",[52,1887,1889],{"className":1863,"code":1888,"language":1865,"meta":57,"style":57},"set(PREFIX \"swap\")\n",[59,1890,1891],{"__ignoreMap":57},[62,1892,1893,1895,1897,1899,1902],{"class":64,"line":65},[62,1894,1872],{"class":154},[62,1896,162],{"class":68},[62,1898,1877],{"class":158},[62,1900,1901],{"class":383}," \"swap\"",[62,1903,179],{"class":68},[18,1905,1906],{},"这样 CMake 会创建一个名为：",[52,1908,1911],{"className":1909,"code":1910,"language":1358,"meta":57},[1356],"swap_src_lib\n",[59,1912,1910],{"__ignoreMap":57},[18,1914,1915],{},"的库。",[18,1917,1918,1920,1921,1924],{},[59,1919,1379],{}," 这个例子不需要 Eigen，所以删除 ",[59,1922,1923],{},"Third-party dependencies"," 区块里的 Eigen 依赖：",[52,1926,1928],{"className":1863,"code":1927,"language":1865,"meta":57,"style":57},"find_package(Eigen3 REQUIRED)\n\ntarget_link_libraries(${PREFIX}_src_lib\n  PUBLIC\n    Eigen3::Eigen\n)\n",[59,1929,1930,1938,1942,1955,1960,1965],{"__ignoreMap":57},[62,1931,1932,1935],{"class":64,"line":65},[62,1933,1934],{"class":154},"find_package",[62,1936,1937],{"class":68},"(Eigen3 REQUIRED)\n",[62,1939,1940],{"class":64,"line":72},[62,1941,82],{"emptyLinePlaceholder":81},[62,1943,1944,1947,1949,1952],{"class":64,"line":78},[62,1945,1946],{"class":154},"target_link_libraries",[62,1948,162],{"class":68},[62,1950,1951],{"class":154},"${PREFIX}",[62,1953,1954],{"class":68},"_src_lib\n",[62,1956,1957],{"class":64,"line":85},[62,1958,1959],{"class":158},"  PUBLIC\n",[62,1961,1962],{"class":64,"line":91},[62,1963,1964],{"class":68},"    Eigen3::Eigen\n",[62,1966,1967],{"class":64,"line":96},[62,1968,179],{"class":68},[18,1970,1971],{},"只用修改以上两项,其他的均不用修改,下面介绍一下比较重点的地方:",[18,1973,1974,1975,1978],{},"整理后，",[59,1976,1977],{},"src\u002Fswap\u002FCMakeLists.txt"," 可以写成：",[52,1980,1982],{"className":1863,"code":1981,"language":1865,"meta":57,"style":57},"set(PREFIX \"swap\")\n\nfile(GLOB_RECURSE ${PREFIX}_SRC_LIST CONFIGURE_DEPENDS\n  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.c\"\n  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.cpp\"\n)\n\nadd_library(${PREFIX}_src_lib SHARED\n  ${${PREFIX}_SRC_LIST}\n)\n\ntarget_include_directories(${PREFIX}_src_lib\n  PUBLIC\n    $\u003CBUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}\u002Finc>\n    $\u003CINSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>\n)\n\ntarget_link_libraries(${PREFIX}_src_lib\n  PUBLIC\n    project_options\n  PRIVATE\n    project_warnings\n)\n\n# ========================\n# Third-party dependencies\n# ========================\n\n# =======\n# Install\n# =======\ninstall(TARGETS ${PREFIX}_src_lib\n  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}\n  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}\n  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n)\n\ninstall(DIRECTORY \"${CMAKE_CURRENT_LIST_DIR}\u002Finc\u002F\"\n  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}\n)\n",[59,1983,1984,1996,2000,2013,2018,2023,2027,2031,2043,2053,2057,2061,2072,2076,2087,2098,2102,2106,2116,2120,2125,2130,2135,2139,2143,2148,2153,2157,2161,2166,2171,2176,2189,2198,2206,2215,2220,2225,2236,2245],{"__ignoreMap":57},[62,1985,1986,1988,1990,1992,1994],{"class":64,"line":65},[62,1987,1872],{"class":154},[62,1989,162],{"class":68},[62,1991,1877],{"class":158},[62,1993,1901],{"class":383},[62,1995,179],{"class":68},[62,1997,1998],{"class":64,"line":72},[62,1999,82],{"emptyLinePlaceholder":81},[62,2001,2002,2005,2008,2010],{"class":64,"line":78},[62,2003,2004],{"class":154},"file",[62,2006,2007],{"class":68},"(GLOB_RECURSE ",[62,2009,1951],{"class":154},[62,2011,2012],{"class":68},"_SRC_LIST CONFIGURE_DEPENDS\n",[62,2014,2015],{"class":64,"line":85},[62,2016,2017],{"class":383},"  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.c\"\n",[62,2019,2020],{"class":64,"line":91},[62,2021,2022],{"class":383},"  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.cpp\"\n",[62,2024,2025],{"class":64,"line":96},[62,2026,179],{"class":68},[62,2028,2029],{"class":64,"line":102},[62,2030,82],{"emptyLinePlaceholder":81},[62,2032,2033,2036,2038,2040],{"class":64,"line":107},[62,2034,2035],{"class":154},"add_library",[62,2037,162],{"class":68},[62,2039,1951],{"class":154},[62,2041,2042],{"class":68},"_src_lib SHARED\n",[62,2044,2045,2048,2050],{"class":64,"line":315},[62,2046,2047],{"class":68},"  ${",[62,2049,1951],{"class":154},[62,2051,2052],{"class":68},"_SRC_LIST}\n",[62,2054,2055],{"class":64,"line":320},[62,2056,179],{"class":68},[62,2058,2059],{"class":64,"line":337},[62,2060,82],{"emptyLinePlaceholder":81},[62,2062,2063,2066,2068,2070],{"class":64,"line":351},[62,2064,2065],{"class":154},"target_include_directories",[62,2067,162],{"class":68},[62,2069,1951],{"class":154},[62,2071,1954],{"class":68},[62,2073,2074],{"class":64,"line":357},[62,2075,1959],{"class":158},[62,2077,2078,2081,2084],{"class":64,"line":374},[62,2079,2080],{"class":68},"    $\u003CBUILD_INTERFACE:",[62,2082,2083],{"class":154},"${CMAKE_CURRENT_LIST_DIR}",[62,2085,2086],{"class":68},"\u002Finc>\n",[62,2088,2089,2092,2095],{"class":64,"line":397},[62,2090,2091],{"class":68},"    $\u003CINSTALL_INTERFACE:",[62,2093,2094],{"class":154},"${CMAKE_INSTALL_INCLUDEDIR}",[62,2096,2097],{"class":68},">\n",[62,2099,2100],{"class":64,"line":402},[62,2101,179],{"class":68},[62,2103,2104],{"class":64,"line":415},[62,2105,82],{"emptyLinePlaceholder":81},[62,2107,2108,2110,2112,2114],{"class":64,"line":427},[62,2109,1946],{"class":154},[62,2111,162],{"class":68},[62,2113,1951],{"class":154},[62,2115,1954],{"class":68},[62,2117,2118],{"class":64,"line":432},[62,2119,1959],{"class":158},[62,2121,2122],{"class":64,"line":445},[62,2123,2124],{"class":68},"    project_options\n",[62,2126,2127],{"class":64,"line":462},[62,2128,2129],{"class":158},"  PRIVATE\n",[62,2131,2132],{"class":64,"line":467},[62,2133,2134],{"class":68},"    project_warnings\n",[62,2136,2137],{"class":64,"line":472},[62,2138,179],{"class":68},[62,2140,2141],{"class":64,"line":482},[62,2142,82],{"emptyLinePlaceholder":81},[62,2144,2145],{"class":64,"line":745},[62,2146,2147],{"class":148},"# ========================\n",[62,2149,2150],{"class":64,"line":763},[62,2151,2152],{"class":148},"# Third-party dependencies\n",[62,2154,2155],{"class":64,"line":781},[62,2156,2147],{"class":148},[62,2158,2159],{"class":64,"line":786},[62,2160,82],{"emptyLinePlaceholder":81},[62,2162,2163],{"class":64,"line":791},[62,2164,2165],{"class":148},"# =======\n",[62,2167,2168],{"class":64,"line":800},[62,2169,2170],{"class":148},"# Install\n",[62,2172,2174],{"class":64,"line":2173},31,[62,2175,2165],{"class":148},[62,2177,2179,2182,2185,2187],{"class":64,"line":2178},32,[62,2180,2181],{"class":154},"install",[62,2183,2184],{"class":68},"(TARGETS ",[62,2186,1951],{"class":154},[62,2188,1954],{"class":68},[62,2190,2192,2195],{"class":64,"line":2191},33,[62,2193,2194],{"class":68},"  LIBRARY DESTINATION ",[62,2196,2197],{"class":154},"${CMAKE_INSTALL_LIBDIR}\n",[62,2199,2201,2204],{"class":64,"line":2200},34,[62,2202,2203],{"class":68},"  ARCHIVE DESTINATION ",[62,2205,2197],{"class":154},[62,2207,2209,2212],{"class":64,"line":2208},35,[62,2210,2211],{"class":68},"  RUNTIME DESTINATION ",[62,2213,2214],{"class":154},"${CMAKE_INSTALL_BINDIR}\n",[62,2216,2218],{"class":64,"line":2217},36,[62,2219,179],{"class":68},[62,2221,2223],{"class":64,"line":2222},37,[62,2224,82],{"emptyLinePlaceholder":81},[62,2226,2228,2230,2233],{"class":64,"line":2227},38,[62,2229,2181],{"class":154},[62,2231,2232],{"class":68},"(DIRECTORY ",[62,2234,2235],{"class":383},"\"${CMAKE_CURRENT_LIST_DIR}\u002Finc\u002F\"\n",[62,2237,2239,2242],{"class":64,"line":2238},39,[62,2240,2241],{"class":68},"  DESTINATION ",[62,2243,2244],{"class":154},"${CMAKE_INSTALL_INCLUDEDIR}\n",[62,2246,2248],{"class":64,"line":2247},40,[62,2249,179],{"class":68},[18,2251,2252],{},"这里最重要的几行是：",[52,2254,2256],{"className":1863,"code":2255,"language":1865,"meta":57,"style":57},"file(GLOB_RECURSE ${PREFIX}_SRC_LIST CONFIGURE_DEPENDS\n  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.c\"\n  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.cpp\"\n)\n",[59,2257,2258,2268,2272,2276],{"__ignoreMap":57},[62,2259,2260,2262,2264,2266],{"class":64,"line":65},[62,2261,2004],{"class":154},[62,2263,2007],{"class":68},[62,2265,1951],{"class":154},[62,2267,2012],{"class":68},[62,2269,2270],{"class":64,"line":72},[62,2271,2017],{"class":383},[62,2273,2274],{"class":64,"line":78},[62,2275,2022],{"class":383},[62,2277,2278],{"class":64,"line":85},[62,2279,179],{"class":68},[18,2281,2282,2283,2286,2287,2289,2290,2292],{},"它会把 ",[59,2284,2285],{},"src\u002Fswap\u002Fsrc\u002F"," 里面的 ",[59,2288,1336],{}," 文件收集进来，所以 ",[59,2291,1386],{}," 会参与编译。",[18,2294,2295],{},"还有：",[52,2297,2299],{"className":1863,"code":2298,"language":1865,"meta":57,"style":57},"target_include_directories(${PREFIX}_src_lib\n  PUBLIC\n    $\u003CBUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}\u002Finc>\n    $\u003CINSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>\n)\n",[59,2300,2301,2311,2315,2323,2331],{"__ignoreMap":57},[62,2302,2303,2305,2307,2309],{"class":64,"line":65},[62,2304,2065],{"class":154},[62,2306,162],{"class":68},[62,2308,1951],{"class":154},[62,2310,1954],{"class":68},[62,2312,2313],{"class":64,"line":72},[62,2314,1959],{"class":158},[62,2316,2317,2319,2321],{"class":64,"line":78},[62,2318,2080],{"class":68},[62,2320,2083],{"class":154},[62,2322,2086],{"class":68},[62,2324,2325,2327,2329],{"class":64,"line":85},[62,2326,2091],{"class":68},[62,2328,2094],{"class":154},[62,2330,2097],{"class":68},[62,2332,2333],{"class":64,"line":91},[62,2334,179],{"class":68},[18,2336,2337,2338,2341],{},"它把 ",[59,2339,2340],{},"src\u002Fswap\u002Finc\u002F"," 加入头文件搜索路径，所以代码里才能写：",[52,2343,2345],{"className":54,"code":2344,"language":56,"meta":57,"style":57},"#include \"swap\u002Fswap.h\"\n",[59,2346,2347],{"__ignoreMap":57},[62,2348,2349,2351],{"class":64,"line":65},[62,2350,1511],{"class":154},[62,2352,1610],{"class":383},[18,2354,2355,2356,2359,2360,2362,2363,2366,2367,1407],{},"注意：不要写成 ",[59,2357,2358],{},"#include \"inc\u002Fswap\u002Fswap.h\"","。CMake 已经把 ",[59,2361,2340],{}," 告诉编译器了，所以 include 时从 ",[59,2364,2365],{},"inc\u002F"," 里面继续往后写，也就是 ",[59,2368,2369],{},"swap\u002Fswap.h",[18,2371,2372,2373,2377,2378,2380,2381,2384,2385,2387],{},"完整 CMake 写法会在 ",[1348,2374,2376],{"href":2375},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","CMake工程模板"," 中系统讲解。这里先知道\"头文件放进 ",[59,2379,2365],{},"，源文件放进 ",[59,2382,2383],{},"src\u002F","，库名由 ",[59,2386,1877],{}," 决定\"即可。",[1440,2389,2391],{"id":2390},"修改-srccmakeliststxt","修改 src\u002FCMakeLists.txt",[18,2393,1492],{},[52,2395,2398],{"className":2396,"code":2397,"language":1358,"meta":57},[1356],"src\u002FCMakeLists.txt\n",[59,2399,2397],{"__ignoreMap":57},[18,2401,2402],{},"原来模板里有：",[52,2404,2406],{"className":1863,"code":2405,"language":1865,"meta":57,"style":57},"add_subdirectory(lib1)\nadd_subdirectory(lib2)\n",[59,2407,2408,2416],{"__ignoreMap":57},[62,2409,2410,2413],{"class":64,"line":65},[62,2411,2412],{"class":154},"add_subdirectory",[62,2414,2415],{"class":68},"(lib1)\n",[62,2417,2418,2420],{"class":64,"line":72},[62,2419,2412],{"class":154},[62,2421,2422],{"class":68},"(lib2)\n",[18,2424,1885],{},[52,2426,2428],{"className":1863,"code":2427,"language":1865,"meta":57,"style":57},"add_subdirectory(swap)\n",[59,2429,2430],{"__ignoreMap":57},[62,2431,2432,2434],{"class":64,"line":65},[62,2433,2412],{"class":154},[62,2435,2436],{"class":68},"(swap)\n",[18,2438,2439,2440,2442,2443,2445,2446,2448],{},"原来的模板里允许",[59,2441,1365],{},"调用",[59,2444,1369],{},",现在",[59,2447,1369],{},"没了,所以删掉这部分:",[52,2450,2452],{"className":1863,"code":2451,"language":1865,"meta":57,"style":57},"target_link_libraries(lib1_src_lib\n  PRIVATE\n    lib2_src_lib\n)\n",[59,2453,2454,2461,2465,2470],{"__ignoreMap":57},[62,2455,2456,2458],{"class":64,"line":65},[62,2457,1946],{"class":154},[62,2459,2460],{"class":68},"(lib1_src_lib\n",[62,2462,2463],{"class":64,"line":72},[62,2464,2129],{"class":158},[62,2466,2467],{"class":64,"line":78},[62,2468,2469],{"class":68},"    lib2_src_lib\n",[62,2471,2472],{"class":64,"line":85},[62,2473,179],{"class":68},[18,2475,2476],{},"上面的这个直接删除.",[18,2478,2479],{},"原来模板里还会链接：",[52,2481,2483],{"className":1863,"code":2482,"language":1865,"meta":57,"style":57},"target_link_libraries(${PROJECT_NAME}\n  PRIVATE\n    lib1_src_lib\n    lib2_src_lib\n)\n",[59,2484,2485,2494,2498,2503,2507],{"__ignoreMap":57},[62,2486,2487,2489,2491],{"class":64,"line":65},[62,2488,1946],{"class":154},[62,2490,162],{"class":68},[62,2492,2493],{"class":154},"${PROJECT_NAME}\n",[62,2495,2496],{"class":64,"line":72},[62,2497,2129],{"class":158},[62,2499,2500],{"class":64,"line":78},[62,2501,2502],{"class":68},"    lib1_src_lib\n",[62,2504,2505],{"class":64,"line":85},[62,2506,2469],{"class":68},[62,2508,2509],{"class":64,"line":91},[62,2510,179],{"class":68},[18,2512,1885],{},[52,2514,2516],{"className":1863,"code":2515,"language":1865,"meta":57,"style":57},"target_link_libraries(${PROJECT_NAME}\n  PRIVATE\n    swap_src_lib\n)\n",[59,2517,2518,2526,2530,2535],{"__ignoreMap":57},[62,2519,2520,2522,2524],{"class":64,"line":65},[62,2521,1946],{"class":154},[62,2523,162],{"class":68},[62,2525,2493],{"class":154},[62,2527,2528],{"class":64,"line":72},[62,2529,2129],{"class":158},[62,2531,2532],{"class":64,"line":78},[62,2533,2534],{"class":68},"    swap_src_lib\n",[62,2536,2537],{"class":64,"line":85},[62,2538,179],{"class":68},[18,2540,2541],{},"只用修改以上三项,其他的均不用修改,下面介绍一下比较重点的地方:",[18,2543,1974,2544,1978],{},[59,2545,2546],{},"src\u002FCMakeLists.txt",[52,2548,2550],{"className":1863,"code":2549,"language":1865,"meta":57,"style":57},"add_executable(${PROJECT_NAME}\n  ${CMAKE_CURRENT_SOURCE_DIR}\u002Fmain.cpp\n)\n\ntarget_link_libraries(${PROJECT_NAME}\n  PRIVATE\n    project_options\n    project_warnings\n)\n\nadd_subdirectory(swap)\n\ntarget_link_libraries(${PROJECT_NAME}\n  PRIVATE\n    swap_src_lib\n)\n\nset_target_properties(${PROJECT_NAME} PROPERTIES\n  INSTALL_RPATH \"$ORIGIN\u002F..\u002F${CMAKE_INSTALL_LIBDIR}\"\n)\n\ninstall(TARGETS ${PROJECT_NAME}\n  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n)\n",[59,2551,2552,2561,2569,2573,2577,2585,2589,2593,2597,2601,2605,2611,2615,2623,2627,2631,2635,2639,2652,2660,2664,2668,2676,2682],{"__ignoreMap":57},[62,2553,2554,2557,2559],{"class":64,"line":65},[62,2555,2556],{"class":154},"add_executable",[62,2558,162],{"class":68},[62,2560,2493],{"class":154},[62,2562,2563,2566],{"class":64,"line":72},[62,2564,2565],{"class":154},"  ${CMAKE_CURRENT_SOURCE_DIR}",[62,2567,2568],{"class":68},"\u002Fmain.cpp\n",[62,2570,2571],{"class":64,"line":78},[62,2572,179],{"class":68},[62,2574,2575],{"class":64,"line":85},[62,2576,82],{"emptyLinePlaceholder":81},[62,2578,2579,2581,2583],{"class":64,"line":91},[62,2580,1946],{"class":154},[62,2582,162],{"class":68},[62,2584,2493],{"class":154},[62,2586,2587],{"class":64,"line":96},[62,2588,2129],{"class":158},[62,2590,2591],{"class":64,"line":102},[62,2592,2124],{"class":68},[62,2594,2595],{"class":64,"line":107},[62,2596,2134],{"class":68},[62,2598,2599],{"class":64,"line":315},[62,2600,179],{"class":68},[62,2602,2603],{"class":64,"line":320},[62,2604,82],{"emptyLinePlaceholder":81},[62,2606,2607,2609],{"class":64,"line":337},[62,2608,2412],{"class":154},[62,2610,2436],{"class":68},[62,2612,2613],{"class":64,"line":351},[62,2614,82],{"emptyLinePlaceholder":81},[62,2616,2617,2619,2621],{"class":64,"line":357},[62,2618,1946],{"class":154},[62,2620,162],{"class":68},[62,2622,2493],{"class":154},[62,2624,2625],{"class":64,"line":374},[62,2626,2129],{"class":158},[62,2628,2629],{"class":64,"line":397},[62,2630,2534],{"class":68},[62,2632,2633],{"class":64,"line":402},[62,2634,179],{"class":68},[62,2636,2637],{"class":64,"line":415},[62,2638,82],{"emptyLinePlaceholder":81},[62,2640,2641,2644,2646,2649],{"class":64,"line":427},[62,2642,2643],{"class":154},"set_target_properties",[62,2645,162],{"class":68},[62,2647,2648],{"class":154},"${PROJECT_NAME}",[62,2650,2651],{"class":68}," PROPERTIES\n",[62,2653,2654,2657],{"class":64,"line":432},[62,2655,2656],{"class":167},"  INSTALL_RPATH",[62,2658,2659],{"class":383}," \"$ORIGIN\u002F..\u002F${CMAKE_INSTALL_LIBDIR}\"\n",[62,2661,2662],{"class":64,"line":445},[62,2663,179],{"class":68},[62,2665,2666],{"class":64,"line":462},[62,2667,82],{"emptyLinePlaceholder":81},[62,2669,2670,2672,2674],{"class":64,"line":467},[62,2671,2181],{"class":154},[62,2673,2184],{"class":68},[62,2675,2493],{"class":154},[62,2677,2678,2680],{"class":64,"line":472},[62,2679,2211],{"class":68},[62,2681,2214],{"class":154},[62,2683,2684],{"class":64,"line":482},[62,2685,179],{"class":68},[18,2687,2688],{},"这两处最关键：",[52,2690,2691],{"className":1863,"code":2427,"language":1865,"meta":57,"style":57},[59,2692,2693],{"__ignoreMap":57},[62,2694,2695,2697],{"class":64,"line":65},[62,2696,2412],{"class":154},[62,2698,2436],{"class":68},[18,2700,2701,2702,2705,2706,1407],{},"意思是：让 CMake 进入 ",[59,2703,2704],{},"src\u002Fswap\u002F","，读取 ",[59,2707,1977],{},[52,2709,2710],{"className":1863,"code":2515,"language":1865,"meta":57,"style":57},[59,2711,2712,2720,2724,2728],{"__ignoreMap":57},[62,2713,2714,2716,2718],{"class":64,"line":65},[62,2715,1946],{"class":154},[62,2717,162],{"class":68},[62,2719,2493],{"class":154},[62,2721,2722],{"class":64,"line":72},[62,2723,2129],{"class":158},[62,2725,2726],{"class":64,"line":78},[62,2727,2534],{"class":68},[62,2729,2730],{"class":64,"line":85},[62,2731,179],{"class":68},[18,2733,2734,2735,2737,2738,2741,2742,2744],{},"意思是：主程序调用了 ",[59,2736,1379],{}," 函数，所以主程序要链接 ",[59,2739,2740],{},"swap_src_lib","，否则链接器找不到 ",[59,2743,1379],{}," 函数的定义。",[1440,2746,2747],{"id":2747},"重新构建并运行",[18,2749,2750],{},"编译",[18,2752,2753],{},[1453,2754],{"alt":1455,"src":2755},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1780713420848.webp",[18,2757,2758],{},"此时你再看clangd的代码提示就不报错了.",[18,2760,2761],{},[1453,2762],{"alt":1455,"src":2763},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1780713445608.webp",[18,2765,2766],{},"然后运行:",[18,2768,2769],{},[1453,2770],{"alt":1455,"src":2771},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1780713490504.webp",[18,2773,2774],{},"输出类似：",[52,2776,2779],{"className":2777,"code":2778,"language":1358,"meta":57},[1356],"a = 200\nb = 100\n",[59,2780,2778],{"__ignoreMap":57},[18,2782,2783,2784,2786],{},"可以看到，",[59,2785,1386],{}," 里的函数确实被主程序调用到了。",[1440,2788,2789],{"id":2789},"分文件编写的核心理解",[18,2791,2792],{},"在这个模板中，函数分文件编写不是只把文件拆开，还要让 CMake 知道这些文件属于哪个库。",[18,2794,2795],{},"对应关系如下：",[2797,2798,2799,2813],"table",{},[2800,2801,2802],"thead",{},[2803,2804,2805,2810],"tr",{},[2806,2807,2809],"th",{"align":2808},"left","文件",[2806,2811,2812],{"align":2808},"作用",[2814,2815,2816,2830,2840,2853,2864],"tbody",{},[2803,2817,2818,2824],{},[2819,2820,2821],"td",{"align":2808},[59,2822,2823],{},"src\u002Fswap\u002Finc\u002Fswap\u002Fswap.h",[2819,2825,2826,2827,2829],{"align":2808},"写函数声明，让其他 ",[59,2828,1336],{}," 文件知道怎么调用",[2803,2831,2832,2837],{},[2819,2833,2834],{"align":2808},[59,2835,2836],{},"src\u002Fswap\u002Fsrc\u002Fswap.cpp",[2819,2838,2839],{"align":2808},"写函数定义，提供真正的实现",[2803,2841,2842,2846],{},[2819,2843,2844],{"align":2808},[59,2845,1977],{},[2819,2847,1410,2848,2850,2851],{"align":2808},[59,2849,1386],{}," 编译成 ",[59,2852,2740],{},[2803,2854,2855,2859],{},[2819,2856,2857],{"align":2808},[59,2858,2546],{},[2819,2860,1410,2861,2863],{"align":2808},[59,2862,2740],{}," 链接到主程序",[2803,2865,2866,2870],{},[2819,2867,2868],{"align":2808},[59,2869,1317],{},[2819,2871,2872,2874,2875],{"align":2808},[59,2873,1717],{}," 后调用 ",[59,2876,2877],{},"swap(a, b)",[18,2879,2880,2881,2883,2884,2886],{},"如果漏了 ",[59,2882,1717],{},"，编译器不知道 ",[59,2885,1379],{}," 函数的声明。",[18,2888,2880,2889,2892,2893,1407],{},[59,2890,2891],{},"add_subdirectory(swap)","，CMake 不会进入 ",[59,2894,2895],{},"src\u002Fswap",[18,2897,2898],{},"如果漏了：",[52,2900,2901],{"className":1863,"code":2515,"language":1865,"meta":57,"style":57},[59,2902,2903,2911,2915,2919],{"__ignoreMap":57},[62,2904,2905,2907,2909],{"class":64,"line":65},[62,2906,1946],{"class":154},[62,2908,162],{"class":68},[62,2910,2493],{"class":154},[62,2912,2913],{"class":64,"line":72},[62,2914,2129],{"class":158},[62,2916,2917],{"class":64,"line":78},[62,2918,2534],{"class":68},[62,2920,2921],{"class":64,"line":85},[62,2922,179],{"class":68},[18,2924,2925,2926,2928],{},"链接器找不到 ",[59,2927,1379],{}," 函数的实现。",[10,2930,2931],{"id":2931},"头文件的组织方式",[18,2933,2934,2935,2937,2938,2940,2941,1407],{},"刚才我们把 ",[59,2936,1379],{}," 函数的声明放进了 ",[59,2939,1383],{},"。其他源文件只要包含这个头文件，就能知道这个库提供了哪些函数。这些提供给外部代码使用的函数、类型和变量，通常统称为库的 ",[48,2942,2943],{},"API",[18,2945,2946],{},"头文件一般负责放置：",[821,2948,2949,2952,2955,2958],{},[121,2950,2951],{},"函数声明。",[121,2953,2954],{},"类型、结构体和类的声明或定义。",[121,2956,2957],{},"必要的常量与变量声明。",[121,2959,2960],{},"使用这些声明所必需的其他头文件。",[18,2962,2963,2964,2967,2968,2970],{},"头文件本身不能单独运行。修改头文件后，需要重新编译包含它的 ",[59,2965,2966],{},".c"," 或 ",[59,2969,1336],{}," 文件来验证。",[14,2972,2974],{"id":2973},"纯-c-工程的头文件","纯 C++ 工程的头文件",[18,2976,2977,2978,2980,2981,2983,2984,2986],{},"本章的 ",[59,2979,1379],{}," 库由 ",[59,2982,1386],{}," 实现，并由 ",[59,2985,1342],{}," 调用，所有源文件都按照 C++ 代码编译。因此，我们先来看普通 C++ 头文件的完整写法。",[18,2988,2989],{},"纯 C++ 工程推荐使用下面的头文件模板：",[52,2991,2993],{"className":54,"code":2992,"language":56,"meta":57,"style":57},"#ifndef __FILE_NAME_H_  \u002F\u002F 防止头文件被重复包含，使用时要修改宏名\n#define __FILE_NAME_H_\n\n\u002F* 头文件内容开始 *\u002F\n\n\u002F\u002F 在这里编写必要的预处理指令、类型定义、函数声明和变量声明\n\n\u002F* 头文件内容结束 *\u002F\n\n#endif  \u002F\u002F __FILE_NAME_H_\n",[59,2994,2995,3006,3014,3018,3023,3027,3032,3036,3041,3045],{"__ignoreMap":57},[62,2996,2997,3000,3003],{"class":64,"line":65},[62,2998,2999],{"class":154},"#ifndef",[62,3001,3002],{"class":158}," __FILE_NAME_H_",[62,3004,3005],{"class":148},"  \u002F\u002F 防止头文件被重复包含，使用时要修改宏名\n",[62,3007,3008,3011],{"class":64,"line":72},[62,3009,3010],{"class":154},"#define",[62,3012,3013],{"class":158}," __FILE_NAME_H_\n",[62,3015,3016],{"class":64,"line":78},[62,3017,82],{"emptyLinePlaceholder":81},[62,3019,3020],{"class":64,"line":85},[62,3021,3022],{"class":148},"\u002F* 头文件内容开始 *\u002F\n",[62,3024,3025],{"class":64,"line":91},[62,3026,82],{"emptyLinePlaceholder":81},[62,3028,3029],{"class":64,"line":96},[62,3030,3031],{"class":148},"\u002F\u002F 在这里编写必要的预处理指令、类型定义、函数声明和变量声明\n",[62,3033,3034],{"class":64,"line":102},[62,3035,82],{"emptyLinePlaceholder":81},[62,3037,3038],{"class":64,"line":107},[62,3039,3040],{"class":148},"\u002F* 头文件内容结束 *\u002F\n",[62,3042,3043],{"class":64,"line":315},[62,3044,82],{"emptyLinePlaceholder":81},[62,3046,3047,3050],{"class":64,"line":320},[62,3048,3049],{"class":154},"#endif",[62,3051,3052],{"class":148},"  \u002F\u002F __FILE_NAME_H_\n",[18,3054,3055],{},"使用模板时，要根据实际文件名修改保护宏。例如：",[118,3057,3058,3066],{},[121,3059,3060,3062,3063,1407],{},[59,3061,1383],{}," 可以使用 ",[59,3064,3065],{},"__SWAP_H_",[121,3067,3068,3062,3071,1407],{},[59,3069,3070],{},"camera.hpp",[59,3072,3073],{},"__CAMERA_HPP_",[18,3075,2977,3076,3078],{},[59,3077,1383],{}," 可以整理成：",[52,3080,3082],{"className":54,"code":3081,"language":56,"meta":57,"style":57},"#ifndef __SWAP_H_\n#define __SWAP_H_\n\n#include \u003Ciostream>\nusing namespace std;\n\nvoid swap(int a, int b);\n\n#endif  \u002F\u002F __SWAP_H_\n",[59,3083,3084,3091,3097,3101,3108,3118,3122,3142,3146],{"__ignoreMap":57},[62,3085,3086,3088],{"class":64,"line":65},[62,3087,2999],{"class":154},[62,3089,3090],{"class":158}," __SWAP_H_\n",[62,3092,3093,3095],{"class":64,"line":72},[62,3094,3010],{"class":154},[62,3096,3090],{"class":158},[62,3098,3099],{"class":64,"line":78},[62,3100,82],{"emptyLinePlaceholder":81},[62,3102,3103,3105],{"class":64,"line":85},[62,3104,1511],{"class":154},[62,3106,3107],{"class":383}," \u003Ciostream>\n",[62,3109,3110,3112,3114,3116],{"class":64,"line":91},[62,3111,1519],{"class":154},[62,3113,1522],{"class":154},[62,3115,1525],{"class":158},[62,3117,334],{"class":68},[62,3119,3120],{"class":64,"line":96},[62,3121,82],{"emptyLinePlaceholder":81},[62,3123,3124,3126,3128,3130,3132,3134,3136,3138,3140],{"class":64,"line":102},[62,3125,520],{"class":154},[62,3127,523],{"class":158},[62,3129,162],{"class":68},[62,3131,155],{"class":154},[62,3133,920],{"class":167},[62,3135,171],{"class":68},[62,3137,155],{"class":154},[62,3139,1036],{"class":167},[62,3141,1147],{"class":68},[62,3143,3144],{"class":64,"line":107},[62,3145,82],{"emptyLinePlaceholder":81},[62,3147,3148,3150],{"class":64,"line":315},[62,3149,3049],{"class":154},[62,3151,3152],{"class":148},"  \u002F\u002F __SWAP_H_\n",[18,3154,3155],{},"这才是C++头文件最规范的形态.",[18,3157,3158],{},"编译执行后:",[18,3160,3161],{},[1453,3162],{"alt":1455,"src":3163},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1780715053871.webp",[18,3165,3166,3167,1366,3169,3171,3172,3174,3175,3178],{},"这里开头的 ",[59,3168,2999],{},[59,3170,3010],{},"，以及末尾的 ",[59,3173,3049],{},"，组成了 ",[48,3176,3177],{},"头文件保护宏","。同一个头文件即使被间接包含多次，其中的内容也只会参与一次编译，避免出现重复定义等问题。",[18,3180,3181,3182,3185,3186,3188],{},"纯 C++ 项目中也经常使用 ",[59,3183,3184],{},".hpp"," 扩展名，用来强调这是 C++ 头文件；",[59,3187,1329],{}," 同样可以使用。项目自己的头文件通常应该保留扩展名，例如：",[52,3190,3191],{"className":54,"code":2344,"language":56,"meta":57,"style":57},[59,3192,3193],{"__ignoreMap":57},[62,3194,3195,3197],{"class":64,"line":65},[62,3196,1511],{"class":154},[62,3198,1610],{"class":383},[18,3200,3201,3202,3205,3206,3209],{},"标准库中的 ",[59,3203,3204],{},"\u003Ciostream>","、",[59,3207,3208],{},"\u003Cstring>"," 等名字没有扩展名，是 C++ 标准规定的命名方式，不代表项目中的头文件也应该省略扩展名。",[14,3211,3213],{"id":3212},"c-接口以及-cc-混合工程的头文件","C 接口以及 C\u002FC++ 混合工程的头文件",[18,3215,3216,3217,1366,3219,3221,3222,3225,3226,3228,3229,3232,3233,3235],{},"一个工程中可以同时存在 ",[59,3218,2966],{},[59,3220,1336],{}," 文件。例如，既可以让 C++ 源文件",[59,3223,3224],{},"xxx.cpp","调用 ",[59,3227,2966],{}," 文件中的函数，也可以让 ",[59,3230,3231],{},"main.c"," 调用 ",[59,3234,1336],{}," 文件中的函数。",[18,3237,3238],{},"但是，C 与 C++ 编译器处理函数名称的方式并不完全相同。只要调用跨越了 C 和 C++ 的边界，就应提供一个兼容的接口头文件。",[18,3240,3241,3242,3245],{},"头文件中的 ",[59,3243,3244],{},"extern \"C\""," 只会在它被 C++ 编译器处理时生效，作用是告诉 C++ 编译器：这些函数按照 C 语言的链接规则处理。",[18,3247,3248,3249,3251],{},"对于需要在 C 和 C++ 之间使用的接口，推荐使用下面的头文件模板,且建议扩展名为",[59,3250,1329],{},"：",[52,3253,3257],{"className":3254,"code":3255,"language":3256,"meta":57,"style":57},"language-c shiki shiki-themes github-light github-dark","#ifndef __FILE_NAME_H_  \u002F\u002F 防止头文件被重复包含，使用时要修改宏名\n#define __FILE_NAME_H_\n\n#ifdef __cplusplus      \u002F\u002F 当前文件被 C++ 编译器处理时才会成立\nextern \"C\" {\n#endif\n\n\u002F* 头文件内容开始 *\u002F\n\n\u002F\u002F 在这里编写必要的预处理指令、类型定义、函数声明和变量声明\n\n\u002F* 头文件内容结束 *\u002F\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  \u002F\u002F __FILE_NAME_H_\n","c",[59,3258,3259,3267,3277,3281,3292,3303,3308,3312,3316,3320,3324,3328,3332,3336,3343,3347,3351,3355],{"__ignoreMap":57},[62,3260,3261,3263,3265],{"class":64,"line":65},[62,3262,2999],{"class":154},[62,3264,3002],{"class":158},[62,3266,3005],{"class":148},[62,3268,3269,3272,3275],{"class":64,"line":72},[62,3270,3271],{"class":68},"#",[62,3273,3274],{"class":158},"define",[62,3276,3013],{"class":158},[62,3278,3279],{"class":64,"line":78},[62,3280,82],{"emptyLinePlaceholder":81},[62,3282,3283,3286,3289],{"class":64,"line":85},[62,3284,3285],{"class":154},"#ifdef",[62,3287,3288],{"class":158}," __cplusplus",[62,3290,3291],{"class":148},"      \u002F\u002F 当前文件被 C++ 编译器处理时才会成立\n",[62,3293,3294,3297,3300],{"class":64,"line":91},[62,3295,3296],{"class":158},"extern",[62,3298,3299],{"class":383}," \"C\"",[62,3301,3302],{"class":68}," {\n",[62,3304,3305],{"class":64,"line":96},[62,3306,3307],{"class":154},"#endif\n",[62,3309,3310],{"class":64,"line":102},[62,3311,82],{"emptyLinePlaceholder":81},[62,3313,3314],{"class":64,"line":107},[62,3315,3022],{"class":148},[62,3317,3318],{"class":64,"line":315},[62,3319,82],{"emptyLinePlaceholder":81},[62,3321,3322],{"class":64,"line":320},[62,3323,3031],{"class":148},[62,3325,3326],{"class":64,"line":337},[62,3327,82],{"emptyLinePlaceholder":81},[62,3329,3330],{"class":64,"line":351},[62,3331,3040],{"class":148},[62,3333,3334],{"class":64,"line":357},[62,3335,82],{"emptyLinePlaceholder":81},[62,3337,3338,3340],{"class":64,"line":374},[62,3339,3285],{"class":154},[62,3341,3342],{"class":158}," __cplusplus\n",[62,3344,3345],{"class":64,"line":397},[62,3346,110],{"class":68},[62,3348,3349],{"class":64,"line":402},[62,3350,3307],{"class":154},[62,3352,3353],{"class":64,"line":415},[62,3354,82],{"emptyLinePlaceholder":81},[62,3356,3357,3359],{"class":64,"line":427},[62,3358,3049],{"class":154},[62,3360,3052],{"class":148},[18,3362,3363,3364,3366],{},"下面的两个例子是两种独立的工程形式，都在前面完成的 ",[59,3365,1379],{}," 工程基础上修改。可以只选择一种练习；如果连续练习，需要按照第二个例子的说明先恢复文件名。",[1440,3368,3370,3232,3372],{"id":3369},"maincpp-调用-swapc",[59,3371,1342],{},[59,3373,3374],{},"swap.c",[18,3376,3377,3378,1373,3380,3382],{},"这个例子保留 C++ 编写的 ",[59,3379,1342],{},[59,3381,1379],{}," 函数改为使用 C 语言实现。",[18,3384,3385,3386,1428,3388,3251],{},"首先将 ",[59,3387,1386],{},[59,3389,3374],{},[18,3391,3392],{},"改完后的主要目录结构为：",[52,3394,3397],{"className":3395,"code":3396,"language":1358,"meta":57},[1356],"src\u002F\n├── CMakeLists.txt\n├── main.cpp\n└── swap\u002F\n    ├── CMakeLists.txt\n    ├── inc\u002Fswap\u002Fswap.h\n    └── src\u002Fswap.c\n",[59,3398,3396],{"__ignoreMap":57},[18,3400,3401],{},[1453,3402],{"alt":1455,"src":3403},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1780715114622.webp",[18,3405,3406,3407,3409,3410,1366,3412,3414],{},"因为 ",[59,3408,1977],{}," 已经会同时收集 ",[59,3411,2966],{},[59,3413,1336],{}," 文件，所以这里只需重命名文件，不用修改这个 CMake 文件。",[18,3416,1410,3417,3419],{},[59,3418,2823],{}," 改成可以同时被 C 和 C++ 包含的形式：",[52,3421,3423],{"className":3254,"code":3422,"language":3256,"meta":57,"style":57},"#ifndef __SWAP_H_\n#define __SWAP_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid swap(int a, int b);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  \u002F\u002F __SWAP_H_\n",[59,3424,3425,3431,3437,3441,3447,3455,3459,3463,3483,3487,3493,3497,3501,3505],{"__ignoreMap":57},[62,3426,3427,3429],{"class":64,"line":65},[62,3428,2999],{"class":154},[62,3430,3090],{"class":158},[62,3432,3433,3435],{"class":64,"line":72},[62,3434,3010],{"class":154},[62,3436,3090],{"class":158},[62,3438,3439],{"class":64,"line":78},[62,3440,82],{"emptyLinePlaceholder":81},[62,3442,3443,3445],{"class":64,"line":85},[62,3444,3285],{"class":154},[62,3446,3342],{"class":158},[62,3448,3449,3451,3453],{"class":64,"line":91},[62,3450,3296],{"class":154},[62,3452,3299],{"class":383},[62,3454,3302],{"class":68},[62,3456,3457],{"class":64,"line":96},[62,3458,3307],{"class":154},[62,3460,3461],{"class":64,"line":102},[62,3462,82],{"emptyLinePlaceholder":81},[62,3464,3465,3467,3469,3471,3473,3475,3477,3479,3481],{"class":64,"line":107},[62,3466,520],{"class":154},[62,3468,523],{"class":158},[62,3470,162],{"class":68},[62,3472,155],{"class":154},[62,3474,920],{"class":167},[62,3476,171],{"class":68},[62,3478,155],{"class":154},[62,3480,1036],{"class":167},[62,3482,1147],{"class":68},[62,3484,3485],{"class":64,"line":315},[62,3486,82],{"emptyLinePlaceholder":81},[62,3488,3489,3491],{"class":64,"line":320},[62,3490,3285],{"class":154},[62,3492,3342],{"class":158},[62,3494,3495],{"class":64,"line":337},[62,3496,110],{"class":68},[62,3498,3499],{"class":64,"line":351},[62,3500,3307],{"class":154},[62,3502,3503],{"class":64,"line":357},[62,3504,82],{"emptyLinePlaceholder":81},[62,3506,3507,3509],{"class":64,"line":374},[62,3508,3049],{"class":154},[62,3510,3152],{"class":148},[18,3512,3513,3514,3516,3517,1407],{},"注意，这个头文件可能被 C 编译器处理，所以不能再在其中包含 ",[59,3515,3204],{}," 或编写 ",[59,3518,1576],{},[18,3520,3521,3522,3525,3526,3251],{},"在 ",[59,3523,3524],{},"src\u002Fswap\u002Fsrc\u002Fswap.c"," 中使用 C 语言实现 ",[59,3527,1379],{},[52,3529,3531],{"className":3254,"code":3530,"language":3256,"meta":57,"style":57},"#include \"swap\u002Fswap.h\"\n#include \u003Cstdio.h>\n\nvoid swap(int a, int b)\n{\n    int temp = a;\n    a = b;\n    b = temp;\n\n    printf(\"a = %d\\n\", a);\n    printf(\"b = %d\\n\", b);\n}\n",[59,3532,3533,3539,3546,3550,3570,3574,3584,3592,3600,3604,3623,3639],{"__ignoreMap":57},[62,3534,3535,3537],{"class":64,"line":65},[62,3536,1511],{"class":154},[62,3538,1610],{"class":383},[62,3540,3541,3543],{"class":64,"line":72},[62,3542,1511],{"class":154},[62,3544,3545],{"class":383}," \u003Cstdio.h>\n",[62,3547,3548],{"class":64,"line":78},[62,3549,82],{"emptyLinePlaceholder":81},[62,3551,3552,3554,3556,3558,3560,3562,3564,3566,3568],{"class":64,"line":85},[62,3553,520],{"class":154},[62,3555,523],{"class":158},[62,3557,162],{"class":68},[62,3559,155],{"class":154},[62,3561,920],{"class":167},[62,3563,171],{"class":68},[62,3565,155],{"class":154},[62,3567,1036],{"class":167},[62,3569,179],{"class":68},[62,3571,3572],{"class":64,"line":91},[62,3573,75],{"class":68},[62,3575,3576,3578,3580,3582],{"class":64,"line":96},[62,3577,188],{"class":154},[62,3579,600],{"class":68},[62,3581,194],{"class":154},[62,3583,1649],{"class":68},[62,3585,3586,3588,3590],{"class":64,"line":102},[62,3587,405],{"class":68},[62,3589,194],{"class":154},[62,3591,1070],{"class":68},[62,3593,3594,3596,3598],{"class":64,"line":107},[62,3595,418],{"class":68},[62,3597,194],{"class":154},[62,3599,624],{"class":68},[62,3601,3602],{"class":64,"line":315},[62,3603,82],{"emptyLinePlaceholder":81},[62,3605,3606,3609,3611,3614,3617,3620],{"class":64,"line":320},[62,3607,3608],{"class":158},"    printf",[62,3610,162],{"class":68},[62,3612,3613],{"class":383},"\"a = ",[62,3615,3616],{"class":330},"%d\\n",[62,3618,3619],{"class":383},"\"",[62,3621,3622],{"class":68},", a);\n",[62,3624,3625,3627,3629,3632,3634,3636],{"class":64,"line":337},[62,3626,3608],{"class":158},[62,3628,162],{"class":68},[62,3630,3631],{"class":383},"\"b = ",[62,3633,3616],{"class":330},[62,3635,3619],{"class":383},[62,3637,3638],{"class":68},", b);\n",[62,3640,3641],{"class":64,"line":351},[62,3642,110],{"class":68},[18,3644,3645,3647],{},[59,3646,1317],{}," 仍然是 C++ 源文件,且不用做任何更改：",[52,3649,3651],{"className":54,"code":3650,"language":56,"meta":57,"style":57},"#include \"swap\u002Fswap.h\"\n\nint main()\n{\n    int a = 100;\n    int b = 200;\n\n    swap(a, b);\n    return 0;\n}\n",[59,3652,3653,3659,3663,3671,3675,3687,3699,3703,3709,3717],{"__ignoreMap":57},[62,3654,3655,3657],{"class":64,"line":65},[62,3656,1511],{"class":154},[62,3658,1610],{"class":383},[62,3660,3661],{"class":64,"line":72},[62,3662,82],{"emptyLinePlaceholder":81},[62,3664,3665,3667,3669],{"class":64,"line":78},[62,3666,155],{"class":154},[62,3668,309],{"class":158},[62,3670,863],{"class":68},[62,3672,3673],{"class":64,"line":85},[62,3674,75],{"class":68},[62,3676,3677,3679,3681,3683,3685],{"class":64,"line":91},[62,3678,188],{"class":154},[62,3680,325],{"class":68},[62,3682,194],{"class":154},[62,3684,410],{"class":330},[62,3686,334],{"class":68},[62,3688,3689,3691,3693,3695,3697],{"class":64,"line":96},[62,3690,188],{"class":154},[62,3692,342],{"class":68},[62,3694,194],{"class":154},[62,3696,1260],{"class":330},[62,3698,334],{"class":68},[62,3700,3701],{"class":64,"line":102},[62,3702,82],{"emptyLinePlaceholder":81},[62,3704,3705,3707],{"class":64,"line":107},[62,3706,736],{"class":158},[62,3708,442],{"class":68},[62,3710,3711,3713,3715],{"class":64,"line":315},[62,3712,208],{"class":154},[62,3714,477],{"class":330},[62,3716,334],{"class":68},[62,3718,3719],{"class":64,"line":320},[62,3720,110],{"class":68},[18,3722,3723],{},[1453,3724],{"alt":1455,"src":3725},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1780715202883.webp",[18,3727,3728,3729,3731,3732,3735,3736,3738,3739,3741,3742,3744,3745,3747,3748,3750],{},"编译 ",[59,3730,3374],{}," 时，C 编译器不会定义 ",[59,3733,3734],{},"__cplusplus","，因此会跳过 ",[59,3737,3244],{},"。编译 ",[59,3740,1342],{}," 时，C++ 编译器会看到 ",[59,3743,3244],{},"，从而按照 C 语言的链接规则寻找 ",[59,3746,3374],{}," 中的 ",[59,3749,1379],{}," 函数。",[1440,3752,3754,3232,3756],{"id":3753},"mainc-调用-swapcpp",[59,3755,3231],{},[59,3757,1386],{},[491,3759,3760],{},[18,3761,3762],{},"难点,在STM32HAL库中常用",[18,3764,3765,3766,3768],{},"这个例子反过来：入口文件使用 C 语言，而 ",[59,3767,1379],{}," 库继续使用 C++ 实现。",[18,3770,3771,3772,3774,3775,3251],{},"如果刚做完上一个例子，先把 ",[59,3773,3374],{}," 改回 ",[59,3776,1386],{},[18,3778,3779,3780,1428,3782,3251],{},"接着把入口文件 ",[59,3781,1342],{},[59,3783,3231],{},[18,3785,3786],{},[1453,3787],{"alt":1455,"src":3788},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1780715304838.webp",[18,3790,3392],{},[52,3792,3795],{"className":3793,"code":3794,"language":1358,"meta":57},[1356],"src\u002F\n├── CMakeLists.txt\n├── main.c\n└── swap\u002F\n    ├── CMakeLists.txt\n    ├── inc\u002Fswap\u002Fswap.h\n    └── src\u002Fswap.cpp\n",[59,3796,3794],{"__ignoreMap":57},[18,3798,3799,3800,3802],{},"文件名发生变化后，还要打开 ",[59,3801,2546],{},"，把：",[52,3804,3806],{"className":1863,"code":3805,"language":1865,"meta":57,"style":57},"add_executable(${PROJECT_NAME}\n  ${CMAKE_CURRENT_SOURCE_DIR}\u002Fmain.cpp\n)\n",[59,3807,3808,3816,3822],{"__ignoreMap":57},[62,3809,3810,3812,3814],{"class":64,"line":65},[62,3811,2556],{"class":154},[62,3813,162],{"class":68},[62,3815,2493],{"class":154},[62,3817,3818,3820],{"class":64,"line":72},[62,3819,2565],{"class":154},[62,3821,2568],{"class":68},[62,3823,3824],{"class":64,"line":78},[62,3825,179],{"class":68},[18,3827,1885],{},[52,3829,3831],{"className":1863,"code":3830,"language":1865,"meta":57,"style":57},"add_executable(${PROJECT_NAME}\n  ${CMAKE_CURRENT_SOURCE_DIR}\u002Fmain.c\n)\n",[59,3832,3833,3841,3848],{"__ignoreMap":57},[62,3834,3835,3837,3839],{"class":64,"line":65},[62,3836,2556],{"class":154},[62,3838,162],{"class":68},[62,3840,2493],{"class":154},[62,3842,3843,3845],{"class":64,"line":72},[62,3844,2565],{"class":154},[62,3846,3847],{"class":68},"\u002Fmain.c\n",[62,3849,3850],{"class":64,"line":78},[62,3851,179],{"class":68},[18,3853,3854,3856],{},[59,3855,2823],{}," 继续使用前面的兼容写法：",[52,3858,3859],{"className":3254,"code":3422,"language":3256,"meta":57,"style":57},[59,3860,3861,3867,3873,3877,3883,3891,3895,3899,3919,3923,3929,3933,3937,3941],{"__ignoreMap":57},[62,3862,3863,3865],{"class":64,"line":65},[62,3864,2999],{"class":154},[62,3866,3090],{"class":158},[62,3868,3869,3871],{"class":64,"line":72},[62,3870,3010],{"class":154},[62,3872,3090],{"class":158},[62,3874,3875],{"class":64,"line":78},[62,3876,82],{"emptyLinePlaceholder":81},[62,3878,3879,3881],{"class":64,"line":85},[62,3880,3285],{"class":154},[62,3882,3342],{"class":158},[62,3884,3885,3887,3889],{"class":64,"line":91},[62,3886,3296],{"class":154},[62,3888,3299],{"class":383},[62,3890,3302],{"class":68},[62,3892,3893],{"class":64,"line":96},[62,3894,3307],{"class":154},[62,3896,3897],{"class":64,"line":102},[62,3898,82],{"emptyLinePlaceholder":81},[62,3900,3901,3903,3905,3907,3909,3911,3913,3915,3917],{"class":64,"line":107},[62,3902,520],{"class":154},[62,3904,523],{"class":158},[62,3906,162],{"class":68},[62,3908,155],{"class":154},[62,3910,920],{"class":167},[62,3912,171],{"class":68},[62,3914,155],{"class":154},[62,3916,1036],{"class":167},[62,3918,1147],{"class":68},[62,3920,3921],{"class":64,"line":315},[62,3922,82],{"emptyLinePlaceholder":81},[62,3924,3925,3927],{"class":64,"line":320},[62,3926,3285],{"class":154},[62,3928,3342],{"class":158},[62,3930,3931],{"class":64,"line":337},[62,3932,110],{"class":68},[62,3934,3935],{"class":64,"line":351},[62,3936,3307],{"class":154},[62,3938,3939],{"class":64,"line":357},[62,3940,82],{"emptyLinePlaceholder":81},[62,3942,3943,3945],{"class":64,"line":374},[62,3944,3049],{"class":154},[62,3946,3152],{"class":148},[18,3948,3521,3949,3951,3952,3251],{},[59,3950,2836],{}," 中使用 C++ 实现 ",[59,3953,1379],{},[52,3955,3957],{"className":54,"code":3956,"language":56,"meta":57,"style":57},"#include \"swap\u002Fswap.h\"\n#include \u003Ciostream>\n\nvoid swap(int a, int b)\n{\n    int temp = a;\n    a = b;\n    b = temp;\n\n    std::cout \u003C\u003C \"a = \" \u003C\u003C a \u003C\u003C std::endl;\n    std::cout \u003C\u003C \"b = \" \u003C\u003C b \u003C\u003C std::endl;\n}\n",[59,3958,3959,3965,3971,3975,3995,3999,4009,4017,4025,4029,4052,4072],{"__ignoreMap":57},[62,3960,3961,3963],{"class":64,"line":65},[62,3962,1511],{"class":154},[62,3964,1610],{"class":383},[62,3966,3967,3969],{"class":64,"line":72},[62,3968,1511],{"class":154},[62,3970,3107],{"class":383},[62,3972,3973],{"class":64,"line":78},[62,3974,82],{"emptyLinePlaceholder":81},[62,3976,3977,3979,3981,3983,3985,3987,3989,3991,3993],{"class":64,"line":85},[62,3978,520],{"class":154},[62,3980,523],{"class":158},[62,3982,162],{"class":68},[62,3984,155],{"class":154},[62,3986,920],{"class":167},[62,3988,171],{"class":68},[62,3990,155],{"class":154},[62,3992,1036],{"class":167},[62,3994,179],{"class":68},[62,3996,3997],{"class":64,"line":91},[62,3998,75],{"class":68},[62,4000,4001,4003,4005,4007],{"class":64,"line":96},[62,4002,188],{"class":154},[62,4004,600],{"class":68},[62,4006,194],{"class":154},[62,4008,1649],{"class":68},[62,4010,4011,4013,4015],{"class":64,"line":102},[62,4012,405],{"class":68},[62,4014,194],{"class":154},[62,4016,1070],{"class":68},[62,4018,4019,4021,4023],{"class":64,"line":107},[62,4020,418],{"class":68},[62,4022,194],{"class":154},[62,4024,624],{"class":68},[62,4026,4027],{"class":64,"line":315},[62,4028,82],{"emptyLinePlaceholder":81},[62,4030,4031,4034,4037,4039,4041,4043,4045,4047,4049],{"class":64,"line":320},[62,4032,4033],{"class":158},"    std",[62,4035,4036],{"class":68},"::cout ",[62,4038,380],{"class":154},[62,4040,948],{"class":383},[62,4042,387],{"class":154},[62,4044,325],{"class":68},[62,4046,380],{"class":154},[62,4048,1525],{"class":158},[62,4050,4051],{"class":68},"::endl;\n",[62,4053,4054,4056,4058,4060,4062,4064,4066,4068,4070],{"class":64,"line":337},[62,4055,4033],{"class":158},[62,4057,4036],{"class":68},[62,4059,380],{"class":154},[62,4061,1694],{"class":383},[62,4063,387],{"class":154},[62,4065,342],{"class":68},[62,4067,380],{"class":154},[62,4069,1525],{"class":158},[62,4071,4051],{"class":68},[62,4073,4074],{"class":64,"line":351},[62,4075,110],{"class":68},[18,4077,4078,4080,4081,4083,4084,4086],{},[59,4079,1386],{}," 必须包含 ",[59,4082,1383],{},"。C++ 编译器读取头文件后，才会知道这个 ",[59,4085,1379],{}," 函数需要按照 C 语言的链接规则对外提供。",[18,4088,4089,4090,4093,4094,4096,4097,4099],{},"最后在 ",[59,4091,4092],{},"src\u002Fmain.c"," 中调用它,",[59,4095,3231],{},"仍然沿用",[59,4098,1342],{},"不需要做任何修改：",[52,4101,4103],{"className":3254,"code":4102,"language":3256,"meta":57,"style":57},"#include \"swap\u002Fswap.h\"\n\nint main(void)\n{\n    int a = 100;\n    int b = 200;\n\n    swap(a, b);\n    return 0;\n}\n",[59,4104,4105,4111,4115,4127,4131,4143,4155,4159,4165,4173],{"__ignoreMap":57},[62,4106,4107,4109],{"class":64,"line":65},[62,4108,1511],{"class":154},[62,4110,1610],{"class":383},[62,4112,4113],{"class":64,"line":72},[62,4114,82],{"emptyLinePlaceholder":81},[62,4116,4117,4119,4121,4123,4125],{"class":64,"line":78},[62,4118,155],{"class":154},[62,4120,309],{"class":158},[62,4122,162],{"class":68},[62,4124,520],{"class":154},[62,4126,179],{"class":68},[62,4128,4129],{"class":64,"line":85},[62,4130,75],{"class":68},[62,4132,4133,4135,4137,4139,4141],{"class":64,"line":91},[62,4134,188],{"class":154},[62,4136,325],{"class":68},[62,4138,194],{"class":154},[62,4140,410],{"class":330},[62,4142,334],{"class":68},[62,4144,4145,4147,4149,4151,4153],{"class":64,"line":96},[62,4146,188],{"class":154},[62,4148,342],{"class":68},[62,4150,194],{"class":154},[62,4152,1260],{"class":330},[62,4154,334],{"class":68},[62,4156,4157],{"class":64,"line":102},[62,4158,82],{"emptyLinePlaceholder":81},[62,4160,4161,4163],{"class":64,"line":107},[62,4162,736],{"class":158},[62,4164,442],{"class":68},[62,4166,4167,4169,4171],{"class":64,"line":315},[62,4168,208],{"class":154},[62,4170,477],{"class":330},[62,4172,334],{"class":68},[62,4174,4175],{"class":64,"line":320},[62,4176,110],{"class":68},[18,4178,4179,4181,4182,4184,4185,4188,4189,4191],{},[59,4180,3231],{}," 只通过头文件调用 ",[59,4183,1379],{},"，不需要理解 ",[59,4186,4187],{},"std::cout"," 等 C++ 写法。C++ 代码全部留在 ",[59,4190,1386],{}," 中。",[18,4193,4194,4195,4197],{},"只有需要跨越 C\u002FC++ 边界的函数才需要这种兼容写法，其他 ",[59,4196,1336],{}," 文件之间仍然按照普通 C++ 方式调用。",[18,4199,4200,4201,4204,4205,4208,4209,4211,4212,4214,4215,4217,4218,4220],{},"模板的顶层 ",[59,4202,4203],{},"CMakeLists.txt"," 已经通过 ",[59,4206,4207],{},"LANGUAGES C CXX"," 启用了 C 和 C++。CMake 会用 C 编译器编译 ",[59,4210,3231],{},"，用 C++ 编译器编译 ",[59,4213,1386],{},"，并把 ",[59,4216,1386],{}," 构建成模板中的 ",[59,4219,2740],{}," 共享库，最后再将它链接给主程序。",[18,4222,4223,4225],{},[59,4224,3244],{}," 只改变链接规则，并不会把 C++ 代码自动转换成 C。放在其中的接口应使用 C 能理解的类型和写法，不要使用函数重载、类、模板或 C++ 引用等 C++ 专有功能。",[1440,4227,4229,3232,4231,4233],{"id":4228},"mainc-调用-swapcpp进阶",[59,4230,3231],{},[59,4232,1386],{},"(进阶)",[491,4235,4236],{},[18,4237,3762],{},[18,4239,4240,4241,4243,4244,4246],{},"上一个例子直接把 ",[59,4242,1379],{}," 函数做成了 C 接口。这样可以跑通，但也带来一个限制：",[59,4245,1383],{}," 必须让 C 编译器看得懂，所以里面不能写命名空间、类、模板、函数重载、C++ 引用等 C++ 专有写法。",[18,4248,4249,4250,3251],{},"更常见的做法是再加一层 ",[48,4251,4252],{},"C 接口文件",[821,4254,4255,4263,4269],{},[121,4256,4257,4259,4260,1407],{},[59,4258,3231],{}," 只调用一个 C 能理解的函数，例如 ",[59,4261,4262],{},"cpp_main()",[121,4264,4265,4268],{},[59,4266,4267],{},"cpp_interface.cpp"," 负责进入 C++ 世界。",[121,4270,4271,4273],{},[59,4272,1386],{}," 保持普通 C++ 写法，可以使用命名空间。",[18,4275,3392],{},[52,4277,4280],{"className":4278,"code":4279,"language":1358,"meta":57},[1356],"src\u002F\n├── CMakeLists.txt\n├── cpp_interface.cpp\n├── cpp_interface.h\n├── main.c\n└── swap\u002F\n    ├── CMakeLists.txt\n    ├── inc\u002Fswap\u002Fswap.h\n    └── src\u002Fswap.cpp\n",[59,4281,4279],{"__ignoreMap":57},[18,4283,4284,4285,4287,4288,3251],{},"先在 ",[59,4286,2383],{}," 下创建 ",[59,4289,4290],{},"cpp_interface.h",[52,4292,4294],{"className":3254,"code":4293,"language":3256,"meta":57,"style":57},"#ifndef __CPP_INTERFACE_H_\n#define __CPP_INTERFACE_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint cpp_main(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  \u002F\u002F __CPP_INTERFACE_H_\n",[59,4295,4296,4303,4309,4313,4319,4327,4331,4335,4348,4352,4358,4362,4366,4370],{"__ignoreMap":57},[62,4297,4298,4300],{"class":64,"line":65},[62,4299,2999],{"class":154},[62,4301,4302],{"class":158}," __CPP_INTERFACE_H_\n",[62,4304,4305,4307],{"class":64,"line":72},[62,4306,3010],{"class":154},[62,4308,4302],{"class":158},[62,4310,4311],{"class":64,"line":78},[62,4312,82],{"emptyLinePlaceholder":81},[62,4314,4315,4317],{"class":64,"line":85},[62,4316,3285],{"class":154},[62,4318,3342],{"class":158},[62,4320,4321,4323,4325],{"class":64,"line":91},[62,4322,3296],{"class":154},[62,4324,3299],{"class":383},[62,4326,3302],{"class":68},[62,4328,4329],{"class":64,"line":96},[62,4330,3307],{"class":154},[62,4332,4333],{"class":64,"line":102},[62,4334,82],{"emptyLinePlaceholder":81},[62,4336,4337,4339,4342,4344,4346],{"class":64,"line":107},[62,4338,155],{"class":154},[62,4340,4341],{"class":158}," cpp_main",[62,4343,162],{"class":68},[62,4345,520],{"class":154},[62,4347,1147],{"class":68},[62,4349,4350],{"class":64,"line":315},[62,4351,82],{"emptyLinePlaceholder":81},[62,4353,4354,4356],{"class":64,"line":320},[62,4355,3285],{"class":154},[62,4357,3342],{"class":158},[62,4359,4360],{"class":64,"line":337},[62,4361,110],{"class":68},[62,4363,4364],{"class":64,"line":351},[62,4365,3307],{"class":154},[62,4367,4368],{"class":64,"line":357},[62,4369,82],{"emptyLinePlaceholder":81},[62,4371,4372,4374],{"class":64,"line":374},[62,4373,3049],{"class":154},[62,4375,4376],{"class":148},"  \u002F\u002F __CPP_INTERFACE_H_\n",[18,4378,4379,4380,4382,4383,4386],{},"这个头文件才是真正给 ",[59,4381,3231],{}," 使用的 C 接口。它里面只声明 ",[59,4384,4385],{},"cpp_main(void)","，参数和返回值都是 C 能理解的类型。",[18,4388,4389,4390,3251],{},"然后修改 ",[59,4391,4092],{},[52,4393,4395],{"className":3254,"code":4394,"language":3256,"meta":57,"style":57},"#include \"cpp_interface.h\"\n\nint main(void)\n{\n    return cpp_main();\n}\n",[59,4396,4397,4404,4408,4420,4424,4433],{"__ignoreMap":57},[62,4398,4399,4401],{"class":64,"line":65},[62,4400,1511],{"class":154},[62,4402,4403],{"class":383}," \"cpp_interface.h\"\n",[62,4405,4406],{"class":64,"line":72},[62,4407,82],{"emptyLinePlaceholder":81},[62,4409,4410,4412,4414,4416,4418],{"class":64,"line":78},[62,4411,155],{"class":154},[62,4413,309],{"class":158},[62,4415,162],{"class":68},[62,4417,520],{"class":154},[62,4419,179],{"class":68},[62,4421,4422],{"class":64,"line":85},[62,4423,75],{"class":68},[62,4425,4426,4428,4430],{"class":64,"line":91},[62,4427,208],{"class":154},[62,4429,4341],{"class":158},[62,4431,4432],{"class":68},"();\n",[62,4434,4435],{"class":64,"line":96},[62,4436,110],{"class":68},[18,4438,4439,4440,4442,4443,4445,4446,4448,4449,1407],{},"此时 ",[59,4441,3231],{}," 不再包含 ",[59,4444,2369],{},"，也不再直接调用 ",[59,4447,1379],{},"。它只负责启动 C++ 侧的 ",[59,4450,4262],{},[18,4452,4453,4454,4456,4457,4459],{},"接着把 ",[59,4455,2823],{}," 改回普通 C++ 头文件，并给 ",[59,4458,1379],{}," 加上命名空间：",[52,4461,4463],{"className":54,"code":4462,"language":56,"meta":57,"style":57},"#ifndef __SWAP_H_\n#define __SWAP_H_\n\nnamespace swap_demo\n{\nvoid swap(int a, int b);\n}\n\n#endif  \u002F\u002F __SWAP_H_\n",[59,4464,4465,4471,4477,4481,4489,4493,4513,4517,4521],{"__ignoreMap":57},[62,4466,4467,4469],{"class":64,"line":65},[62,4468,2999],{"class":154},[62,4470,3090],{"class":158},[62,4472,4473,4475],{"class":64,"line":72},[62,4474,3010],{"class":154},[62,4476,3090],{"class":158},[62,4478,4479],{"class":64,"line":78},[62,4480,82],{"emptyLinePlaceholder":81},[62,4482,4483,4486],{"class":64,"line":85},[62,4484,4485],{"class":154},"namespace",[62,4487,4488],{"class":158}," swap_demo\n",[62,4490,4491],{"class":64,"line":91},[62,4492,75],{"class":68},[62,4494,4495,4497,4499,4501,4503,4505,4507,4509,4511],{"class":64,"line":96},[62,4496,520],{"class":154},[62,4498,523],{"class":158},[62,4500,162],{"class":68},[62,4502,155],{"class":154},[62,4504,920],{"class":167},[62,4506,171],{"class":68},[62,4508,155],{"class":154},[62,4510,1036],{"class":167},[62,4512,1147],{"class":68},[62,4514,4515],{"class":64,"line":102},[62,4516,110],{"class":68},[62,4518,4519],{"class":64,"line":107},[62,4520,82],{"emptyLinePlaceholder":81},[62,4522,4523,4525],{"class":64,"line":315},[62,4524,3049],{"class":154},[62,4526,3152],{"class":148},[18,4528,4529,4530,4532,4533,4535,4536,4538],{},"注意，这个 ",[59,4531,1383],{}," 现在已经不是 C 接口头文件了。它里面有 ",[59,4534,4485],{},"，所以不能再让 ",[59,4537,3231],{}," 直接包含。",[18,4540,4541,4542,4544],{},"这里也不需要给 ",[59,4543,1383],{}," 加：",[52,4546,4548],{"className":54,"code":4547,"language":56,"meta":57,"style":57},"#ifdef __cplusplus\nextern \"C\" {\n#endif\n",[59,4549,4550,4556,4564],{"__ignoreMap":57},[62,4551,4552,4554],{"class":64,"line":65},[62,4553,3285],{"class":154},[62,4555,3342],{"class":158},[62,4557,4558,4560,4562],{"class":64,"line":72},[62,4559,3296],{"class":154},[62,4561,3299],{"class":383},[62,4563,3302],{"class":68},[62,4565,4566],{"class":64,"line":78},[62,4567,3307],{"class":154},[18,4569,4570,4571,4574,4575,4577,4578,4580,4581,1407],{},"原因是：",[59,4572,4573],{},"swap_demo::swap"," 本来就是一个普通 C++ 函数，我们希望它保留 C++ 的命名空间写法。",[59,4576,3244],{}," 应该只放在 C 代码真正要调用的那层接口上，也就是前面的 ",[59,4579,4290],{}," 里的 ",[59,4582,4385],{},[18,4584,4585],{},"换句话说，进阶版中有两个头文件：",[2797,4587,4588,4603],{},[2800,4589,4590],{},[2803,4591,4592,4595,4598],{},[2806,4593,4594],{"align":2808},"头文件",[2806,4596,4597],{"align":2808},"谁来包含",[2806,4599,4600,4601],{"align":2808},"是否需要 ",[59,4602,3244],{},[2814,4604,4605,4620],{},[2803,4606,4607,4611,4617],{},[2819,4608,4609],{"align":2808},[59,4610,4290],{},[2819,4612,4613,1366,4615],{"align":2808},[59,4614,3231],{},[59,4616,4267],{},[2819,4618,4619],{"align":2808},"需要，因为它是 C\u002FC++ 边界",[2803,4621,4622,4626,4632],{},[2819,4623,4624],{"align":2808},[59,4625,2369],{},[2819,4627,4628,1366,4630],{"align":2808},[59,4629,1386],{},[59,4631,4267],{},[2819,4633,4634],{"align":2808},"不需要，因为它是纯 C++ 头文件",[18,4636,4637,4638,3251],{},"继续修改 ",[59,4639,2836],{},[52,4641,4643],{"className":54,"code":4642,"language":56,"meta":57,"style":57},"#include \"swap\u002Fswap.h\"\n#include \u003Ciostream>\n\nnamespace swap_demo\n{\nvoid swap(int a, int b)\n{\n    int temp = a;\n    a = b;\n    b = temp;\n\n    std::cout \u003C\u003C \"a = \" \u003C\u003C a \u003C\u003C std::endl;\n    std::cout \u003C\u003C \"b = \" \u003C\u003C b \u003C\u003C std::endl;\n}\n}\n",[59,4644,4645,4651,4657,4661,4667,4671,4691,4695,4705,4713,4721,4725,4745,4765,4769],{"__ignoreMap":57},[62,4646,4647,4649],{"class":64,"line":65},[62,4648,1511],{"class":154},[62,4650,1610],{"class":383},[62,4652,4653,4655],{"class":64,"line":72},[62,4654,1511],{"class":154},[62,4656,3107],{"class":383},[62,4658,4659],{"class":64,"line":78},[62,4660,82],{"emptyLinePlaceholder":81},[62,4662,4663,4665],{"class":64,"line":85},[62,4664,4485],{"class":154},[62,4666,4488],{"class":158},[62,4668,4669],{"class":64,"line":91},[62,4670,75],{"class":68},[62,4672,4673,4675,4677,4679,4681,4683,4685,4687,4689],{"class":64,"line":96},[62,4674,520],{"class":154},[62,4676,523],{"class":158},[62,4678,162],{"class":68},[62,4680,155],{"class":154},[62,4682,920],{"class":167},[62,4684,171],{"class":68},[62,4686,155],{"class":154},[62,4688,1036],{"class":167},[62,4690,179],{"class":68},[62,4692,4693],{"class":64,"line":102},[62,4694,75],{"class":68},[62,4696,4697,4699,4701,4703],{"class":64,"line":107},[62,4698,188],{"class":154},[62,4700,600],{"class":68},[62,4702,194],{"class":154},[62,4704,1649],{"class":68},[62,4706,4707,4709,4711],{"class":64,"line":315},[62,4708,405],{"class":68},[62,4710,194],{"class":154},[62,4712,1070],{"class":68},[62,4714,4715,4717,4719],{"class":64,"line":320},[62,4716,418],{"class":68},[62,4718,194],{"class":154},[62,4720,624],{"class":68},[62,4722,4723],{"class":64,"line":337},[62,4724,82],{"emptyLinePlaceholder":81},[62,4726,4727,4729,4731,4733,4735,4737,4739,4741,4743],{"class":64,"line":351},[62,4728,4033],{"class":158},[62,4730,4036],{"class":68},[62,4732,380],{"class":154},[62,4734,948],{"class":383},[62,4736,387],{"class":154},[62,4738,325],{"class":68},[62,4740,380],{"class":154},[62,4742,1525],{"class":158},[62,4744,4051],{"class":68},[62,4746,4747,4749,4751,4753,4755,4757,4759,4761,4763],{"class":64,"line":357},[62,4748,4033],{"class":158},[62,4750,4036],{"class":68},[62,4752,380],{"class":154},[62,4754,1694],{"class":383},[62,4756,387],{"class":154},[62,4758,342],{"class":68},[62,4760,380],{"class":154},[62,4762,1525],{"class":158},[62,4764,4051],{"class":68},[62,4766,4767],{"class":64,"line":374},[62,4768,110],{"class":68},[62,4770,4771],{"class":64,"line":397},[62,4772,110],{"class":68},[18,4774,4775,4776,3251],{},"最后创建 ",[59,4777,4778],{},"src\u002Fcpp_interface.cpp",[52,4780,4782],{"className":54,"code":4781,"language":56,"meta":57,"style":57},"#include \"cpp_interface.h\"\n#include \"swap\u002Fswap.h\"\n\nint cpp_main(void)\n{\n    int a = 100;\n    int b = 200;\n\n    swap_demo::swap(a, b);\n\n    return 0;\n}\n",[59,4783,4784,4790,4796,4800,4812,4816,4828,4840,4844,4856,4860,4868],{"__ignoreMap":57},[62,4785,4786,4788],{"class":64,"line":65},[62,4787,1511],{"class":154},[62,4789,4403],{"class":383},[62,4791,4792,4794],{"class":64,"line":72},[62,4793,1511],{"class":154},[62,4795,1610],{"class":383},[62,4797,4798],{"class":64,"line":78},[62,4799,82],{"emptyLinePlaceholder":81},[62,4801,4802,4804,4806,4808,4810],{"class":64,"line":85},[62,4803,155],{"class":154},[62,4805,4341],{"class":158},[62,4807,162],{"class":68},[62,4809,520],{"class":154},[62,4811,179],{"class":68},[62,4813,4814],{"class":64,"line":91},[62,4815,75],{"class":68},[62,4817,4818,4820,4822,4824,4826],{"class":64,"line":96},[62,4819,188],{"class":154},[62,4821,325],{"class":68},[62,4823,194],{"class":154},[62,4825,410],{"class":330},[62,4827,334],{"class":68},[62,4829,4830,4832,4834,4836,4838],{"class":64,"line":102},[62,4831,188],{"class":154},[62,4833,342],{"class":68},[62,4835,194],{"class":154},[62,4837,1260],{"class":330},[62,4839,334],{"class":68},[62,4841,4842],{"class":64,"line":107},[62,4843,82],{"emptyLinePlaceholder":81},[62,4845,4846,4849,4852,4854],{"class":64,"line":315},[62,4847,4848],{"class":158},"    swap_demo",[62,4850,4851],{"class":68},"::",[62,4853,1379],{"class":158},[62,4855,442],{"class":68},[62,4857,4858],{"class":64,"line":320},[62,4859,82],{"emptyLinePlaceholder":81},[62,4861,4862,4864,4866],{"class":64,"line":337},[62,4863,208],{"class":154},[62,4865,477],{"class":330},[62,4867,334],{"class":68},[62,4869,4870],{"class":64,"line":351},[62,4871,110],{"class":68},[18,4873,4874,4876,4877,4879,4880,4882,4883,4885,4886,4889],{},[59,4875,4267],{}," 是 C 和 C++ 的分界线。它包含了 ",[59,4878,4290],{},"，所以 ",[59,4881,4262],{}," 会按照 C 语言的链接规则对外提供；它本身又是 ",[59,4884,1336],{}," 文件，所以内部可以正常调用 ",[59,4887,4888],{},"swap_demo::swap(a, b)"," 这种 C++ 写法。",[18,4891,4892,4893,1373,4895,4897],{},"文件增加后，还要打开 ",[59,4894,2546],{},[59,4896,4267],{}," 加入主程序：",[52,4899,4901],{"className":1863,"code":4900,"language":1865,"meta":57,"style":57},"add_executable(${PROJECT_NAME}\n  ${CMAKE_CURRENT_SOURCE_DIR}\u002Fmain.c\n  ${CMAKE_CURRENT_SOURCE_DIR}\u002Fcpp_interface.cpp\n)\n",[59,4902,4903,4911,4917,4924],{"__ignoreMap":57},[62,4904,4905,4907,4909],{"class":64,"line":65},[62,4906,2556],{"class":154},[62,4908,162],{"class":68},[62,4910,2493],{"class":154},[62,4912,4913,4915],{"class":64,"line":72},[62,4914,2565],{"class":154},[62,4916,3847],{"class":68},[62,4918,4919,4921],{"class":64,"line":78},[62,4920,2565],{"class":154},[62,4922,4923],{"class":68},"\u002Fcpp_interface.cpp\n",[62,4925,4926],{"class":64,"line":85},[62,4927,179],{"class":68},[18,4929,4930,4931,4933,4934,4937,4938,3205,4940,4942],{},"这里不用把 ",[59,4932,4290],{}," 写进 ",[59,4935,4936],{},"add_executable()","。CMake 主要负责把 ",[59,4939,2966],{},[59,4941,1336],{}," 这类源文件交给编译器编译，头文件本身不会单独编译成一个目标文件。",[18,4944,4945,4947,4948,4950],{},[59,4946,4290],{}," 是通过代码里的 ",[59,4949,1511],{}," 被找到的：",[52,4952,4954],{"className":3254,"code":4953,"language":3256,"meta":57,"style":57},"#include \"cpp_interface.h\"\n",[59,4955,4956],{"__ignoreMap":57},[62,4957,4958,4960],{"class":64,"line":65},[62,4959,1511],{"class":154},[62,4961,4403],{"class":383},[18,4963,3406,4964,3205,4966,1366,4968,4970,4971,4973],{},[59,4965,3231],{},[59,4967,4267],{},[59,4969,4290],{}," 都在 ",[59,4972,2383],{}," 同一层目录下，所以这里使用双引号包含时，编译器可以从当前源文件所在目录找到它。",[18,4975,4976,4977,4979,4980,4982,4983,4986],{},"如果以后把 ",[59,4978,4290],{}," 移到单独的 ",[59,4981,2365],{}," 目录，就需要再用 ",[59,4984,4985],{},"target_include_directories()"," 把那个目录加入头文件搜索路径。当前这个例子放在同一层目录，所以不需要额外修改 CMake。",[18,4988,4989,4991,4992,4994,4995,4997,4998,5000,5001,1407],{},[59,4990,1977],{}," 不需要修改，因为它本来就会收集 ",[59,4993,2285],{}," 目录下的 ",[59,4996,1336],{}," 文件，",[59,4999,1386],{}," 仍然会被编译进 ",[59,5002,2740],{},[18,5004,5005],{},"编译运行后，输出仍然类似：",[52,5007,5009],{"className":5008,"code":2778,"language":1358,"meta":57},[1356],[59,5010,2778],{"__ignoreMap":57},[18,5012,5013,5014,5016,5017,5019,5020,5022,5023,5025,5026,1407],{},"这个进阶写法的重点是：",[59,5015,3244],{}," 只放在最外层、最简单的接口上，也就是 ",[59,5018,4385],{},"。真正的 C++ 代码放在 ",[59,5021,4267],{}," 后面，",[59,5024,1379],{}," 可以使用命名空间，以后也可以继续使用类、模板、函数重载等 C++ 功能，只要这些 C++ 专有内容不要直接暴露给 ",[59,5027,3231],{},[14,5029,5031,1366,5034],{"id":5030},"include-和-include",[59,5032,5033],{},"#include \u003C...>",[59,5035,5036],{},"#include \"...\"",[18,5038,5039],{},"两种写法都用于包含头文件，但常见用途不同：",[52,5041,5043],{"className":54,"code":5042,"language":56,"meta":57,"style":57},"#include \u003Ciostream>\n#include \u003Copencv2\u002Fopencv.hpp>\n",[59,5044,5045,5051],{"__ignoreMap":57},[62,5046,5047,5049],{"class":64,"line":65},[62,5048,1511],{"class":154},[62,5050,3107],{"class":383},[62,5052,5053,5055],{"class":64,"line":72},[62,5054,1511],{"class":154},[62,5056,5057],{"class":383}," \u003Copencv2\u002Fopencv.hpp>\n",[18,5059,5060],{},"尖括号通常用于标准库或已经安装的第三方库头文件。",[52,5062,5063],{"className":54,"code":2344,"language":56,"meta":57,"style":57},[59,5064,5065],{"__ignoreMap":57},[62,5066,5067,5069],{"class":64,"line":65},[62,5068,1511],{"class":154},[62,5070,1610],{"class":383},[18,5072,5073,5074,5077,5078,5080],{},"双引号通常用于当前工程自己的头文件。这里能够写成 ",[59,5075,5076],{},"\"swap\u002Fswap.h\"","，是因为 CMake 已经把 ",[59,5079,2340],{}," 添加到了编译器的头文件搜索路径中。",[18,5082,5083,5084,5086],{},"无论使用 C 还是 C++，都应为头文件添加保护宏；只有头文件需要作为 C 与 C++ 之间的接口时，才在保护宏内部增加 ",[59,5085,3244],{}," 兼容部分。",[5088,5089,5090],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":57,"searchDepth":72,"depth":72,"links":5092},[5093,5102],{"id":12,"depth":72,"text":12,"children":5094},[5095,5096,5097,5098,5099,5100,5101],{"id":16,"depth":78,"text":16},{"id":26,"depth":78,"text":26},{"id":222,"depth":78,"text":222},{"id":498,"depth":78,"text":498},{"id":814,"depth":78,"text":814},{"id":1088,"depth":78,"text":1088},{"id":1308,"depth":78,"text":1308},{"id":2931,"depth":72,"text":2931,"children":5103},[5104,5105,5106],{"id":2973,"depth":78,"text":2974},{"id":3212,"depth":78,"text":3213},{"id":5030,"depth":78,"text":5107},"#include \u003C...> 和 #include \"...\"",0,"0800","2023-10-05","2023-10-05-cplusplus-jiao-xue","\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md",false,{},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian",{"title":5,"description":57},"wiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","1d_Vf6UPHfBXWiDqHHoQ6_AN5MLUtcMqga8rVkc8OgI",[5122,5126,5131,5136,5141,5146,5151,5156,5157,5162,5167,5172,5177,5182,5187,5192,5197,5202,5207,5212,5217,5222,5227,5232,5237,5242,5247,5252,5257,5262,5267,5272,5277,5282,5287,5292,5296,5301,5306,5311,5316,5321,5326,5331,5336,5341,5346,5351,5356,5361,5366,5371,5376,5381,5386,5391,5396,5401,5406,5411,5416,5421,5426,5431,5436,5441,5446,5451,5456,5461,5466,5471,5476,5481,5486,5491,5496,5499],{"path":1350,"stem":5123,"title":5124,"date":5110,"chapterOrder":5125,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"wiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++开发环境搭建与测试","0100",{"path":5127,"stem":5128,"title":5129,"date":5110,"chapterOrder":5130,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基础初识","0200",{"path":5132,"stem":5133,"title":5134,"date":5110,"chapterOrder":5135,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","数据类型与数据存放","0300",{"path":5137,"stem":5138,"title":5139,"date":5110,"chapterOrder":5140,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","输入输出","0400",{"path":5142,"stem":5143,"title":5144,"date":5110,"chapterOrder":5145,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","wiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","运算符","0500",{"path":5147,"stem":5148,"title":5149,"date":5110,"chapterOrder":5150,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","wiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程结构","0600",{"path":5152,"stem":5153,"title":5154,"date":5110,"chapterOrder":5155,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","wiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","数组","0700",{"path":5117,"stem":5119,"title":5,"date":5110,"chapterOrder":5109,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},{"path":5158,"stem":5159,"title":5160,"date":5110,"chapterOrder":5161,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指针","0900",{"path":5163,"stem":5164,"title":5165,"date":5110,"chapterOrder":5166,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","结构体与共用体","1000",{"path":5168,"stem":5169,"title":5170,"date":5110,"chapterOrder":5171,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","内存分区与生命周期","1100",{"path":5173,"stem":5174,"title":5175,"date":5110,"chapterOrder":5176,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","wiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":5178,"stem":5179,"title":5180,"date":5110,"chapterOrder":5181,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","函数提高与命名空间","1300",{"path":5183,"stem":5184,"title":5185,"date":5110,"chapterOrder":5186,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封装","1400-0100",{"path":5188,"stem":5189,"title":5190,"date":5110,"chapterOrder":5191,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","对象初始化和清理","1400-0200",{"path":5193,"stem":5194,"title":5195,"date":5110,"chapterOrder":5196,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","对象模型与this指针","1400-0300",{"path":5198,"stem":5199,"title":5200,"date":5110,"chapterOrder":5201,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元与运算符重载","1400-0400",{"path":5203,"stem":5204,"title":5205,"date":5110,"chapterOrder":5206,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","继承","1400-0500",{"path":5208,"stem":5209,"title":5210,"date":5110,"chapterOrder":5211,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多态","1400-0600",{"path":5213,"stem":5214,"title":5215,"date":5110,"chapterOrder":5216,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","类和对象","1400",{"path":5218,"stem":5219,"title":5220,"date":5110,"chapterOrder":5221,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","wiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":5223,"stem":5224,"title":5225,"date":5110,"chapterOrder":5226,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","wiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理","1600",{"path":5228,"stem":5229,"title":5230,"date":5110,"chapterOrder":5231,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":5233,"stem":5234,"title":5235,"date":5110,"chapterOrder":5236,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初识","1800-0100",{"path":5238,"stem":5239,"title":5240,"date":5110,"chapterOrder":5241,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":5243,"stem":5244,"title":5245,"date":5110,"chapterOrder":5246,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":5248,"stem":5249,"title":5250,"date":5110,"chapterOrder":5251,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-yu-deque-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector与deque容器","vector与deque容器","1800-0400",{"path":5253,"stem":5254,"title":5255,"date":5110,"chapterOrder":5256,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-stack-queue-list-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-stack-queue-list容器","stack \u002F queue \u002F list 容器","1800-0500",{"path":5258,"stem":5259,"title":5260,"date":5110,"chapterOrder":5261,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-set-map-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-set-map容器","set \u002F map 容器","1800-0600",{"path":5263,"stem":5264,"title":5265,"date":5110,"chapterOrder":5266,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-han-shu-dui-xiang-yu-wei-ci","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-函数对象与谓词","函数对象与谓词","1800-0700",{"path":5268,"stem":5269,"title":5270,"date":5110,"chapterOrder":5271,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-chang-yong-suan-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-常用算法","常用算法","1800-0800",{"path":5273,"stem":5274,"title":5275,"date":5110,"chapterOrder":5276,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高编程","1800",{"path":5278,"stem":5279,"title":5280,"date":5110,"chapterOrder":5281,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++类型转换","1900",{"path":5283,"stem":5284,"title":5285,"date":5110,"chapterOrder":5286,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":5288,"stem":5289,"title":5290,"date":5110,"chapterOrder":5291,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":5293,"stem":5294,"title":1519,"date":5110,"chapterOrder":5295,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","2000-0300",{"path":5297,"stem":5298,"title":5299,"date":5110,"chapterOrder":5300,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":5302,"stem":5303,"title":5304,"date":5110,"chapterOrder":5305,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","范围 for 循环","2000-0500",{"path":5307,"stem":5308,"title":5309,"date":5110,"chapterOrder":5310,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","结构化绑定","2000-0600",{"path":5312,"stem":5313,"title":5314,"date":5110,"chapterOrder":5315,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":5317,"stem":5318,"title":5319,"date":5110,"chapterOrder":5320,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":5322,"stem":5323,"title":5324,"date":5110,"chapterOrder":5325,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指针","2000-0900",{"path":5327,"stem":5328,"title":5329,"date":5110,"chapterOrder":5330,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移动语义","2000-1000",{"path":5332,"stem":5333,"title":5334,"date":5110,"chapterOrder":5335,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表达式","2000-1100",{"path":5337,"stem":5338,"title":5339,"date":5110,"chapterOrder":5340,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":5342,"stem":5343,"title":5344,"date":5110,"chapterOrder":5345,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":5347,"stem":5348,"title":5349,"date":5110,"chapterOrder":5350,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":5352,"stem":5353,"title":5354,"date":5110,"chapterOrder":5355,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":5357,"stem":5358,"title":5359,"date":5110,"chapterOrder":5360,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":5362,"stem":5363,"title":5364,"date":5110,"chapterOrder":5365,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":5367,"stem":5368,"title":5369,"date":5110,"chapterOrder":5370,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":5372,"stem":5373,"title":5374,"date":5110,"chapterOrder":5375,"chapterDepth":72,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread 与 join","2000-1900-0100",{"path":5377,"stem":5378,"title":5379,"date":5110,"chapterOrder":5380,"chapterDepth":72,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 与 lock_guard","2000-1900-0200",{"path":5382,"stem":5383,"title":5384,"date":5110,"chapterOrder":5385,"chapterDepth":72,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":5387,"stem":5388,"title":5389,"date":5110,"chapterOrder":5390,"chapterDepth":72,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":5392,"stem":5393,"title":5394,"date":5110,"chapterOrder":5395,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","并发编程","2000-1900",{"path":5397,"stem":5398,"title":5399,"date":5110,"chapterOrder":5400,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":5402,"stem":5403,"title":5404,"date":5110,"chapterOrder":5405,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 简介","2000-2100",{"path":5407,"stem":5408,"title":5409,"date":5110,"chapterOrder":5410,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","现代C++","2000",{"path":5412,"stem":5413,"title":5414,"date":5110,"chapterOrder":5415,"chapterDepth":72,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定时器与异步 IO","2100-0100-0100",{"path":5417,"stem":5418,"title":5419,"date":5110,"chapterOrder":5420,"chapterDepth":72,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基础","2100-0100-0200",{"path":5422,"stem":5423,"title":5424,"date":5110,"chapterOrder":5425,"chapterDepth":72,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信","2100-0100-0300",{"path":5427,"stem":5428,"title":5429,"date":5110,"chapterOrder":5430,"chapterDepth":72,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信","2100-0100-0400",{"path":5432,"stem":5433,"title":5434,"date":5110,"chapterOrder":5435,"chapterDepth":72,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信","2100-0100-0500",{"path":5437,"stem":5438,"title":5439,"date":5110,"chapterOrder":5440,"chapterDepth":72,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成","2100-0100-0600",{"path":5442,"stem":5443,"title":5444,"date":5110,"chapterOrder":5445,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio异步IO库","2100-0100",{"path":5447,"stem":5448,"title":5449,"date":5110,"chapterOrder":5450,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen线性代数库","2100-0200",{"path":5452,"stem":5453,"title":5454,"date":5110,"chapterOrder":5455,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV计算机视觉库","2100-0300",{"path":5457,"stem":5458,"title":5459,"date":5110,"chapterOrder":5460,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL点云库","2100-0400",{"path":5462,"stem":5463,"title":5464,"date":5110,"chapterOrder":5465,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李群李代数库","2100-0500",{"path":5467,"stem":5468,"title":5469,"date":5110,"chapterOrder":5470,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用库学习","2100",{"path":5472,"stem":5473,"title":5474,"date":5110,"chapterOrder":5475,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets与构建安装","2200-0100",{"path":5477,"stem":5478,"title":5479,"date":5110,"chapterOrder":5480,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","顶层CMake与公共编译选项","2200-0200",{"path":5482,"stem":5483,"title":5484,"date":5110,"chapterOrder":5485,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src与lib模块CMake详解","2200-0300",{"path":5487,"stem":5488,"title":5489,"date":5110,"chapterOrder":5490,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方库依赖写法","2200-0400",{"path":5492,"stem":5493,"title":5494,"date":5110,"chapterOrder":5495,"chapterDepth":65,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板扩展与常见问题","2200-0500",{"path":2375,"stem":5497,"title":2376,"date":5110,"chapterOrder":5498,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":5115},"wiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","2200",{"path":5112,"stem":5500,"title":5501,"date":5110,"chapterOrder":5502,"chapterDepth":5108,"docKey":5111,"docRoot":5112,"docTitle":5113,"isWikiDoc":81,"isWikiIndex":81},"wiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",null,1784505232778]