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