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