C++存儲(chǔ)周期作用域鏈接性詳解
在C++程序設(shè)計(jì)中,變量的行為不僅由其類型決定,還由存儲(chǔ)周期(變量在內(nèi)存中存在的時(shí)間)、作用域(變量可被訪問(wèn)的代碼范圍)和鏈接性(變量在多文件程序中的可見(jiàn)性)共同約束。
一、存儲(chǔ)周期(Storage Duration)
存儲(chǔ)周期指變量從被創(chuàng)建到被銷毀的整個(gè)生命周期,決定了變量在內(nèi)存中“存活”的時(shí)間長(zhǎng)度。C++標(biāo)準(zhǔn)定義了四種存儲(chǔ)周期,每種周期對(duì)應(yīng)不同的內(nèi)存分配機(jī)制和生命周期管理方式。
1. 自動(dòng)存儲(chǔ)周期(Automatic Storage Duration)
定義:變量在進(jìn)入其所在的“塊”(由{}包圍的代碼區(qū)域)時(shí)被創(chuàng)建,離開(kāi)該塊時(shí)自動(dòng)銷毀,生命周期與塊的執(zhí)行范圍完全一致。
核心特性:
- 內(nèi)存位置:通常存儲(chǔ)在棧(stack) 中,棧是一種后進(jìn)先出(LIFO)的內(nèi)存區(qū)域,由編譯器自動(dòng)管理分配與釋放。
- 初始化:每次進(jìn)入塊時(shí)都會(huì)重新初始化(若未顯式初始化,局部變量的值為未定義,可能是隨機(jī)值)。
- 適用場(chǎng)景:函數(shù)內(nèi)的局部變量、循環(huán)體/分支語(yǔ)句塊內(nèi)的變量等未被
static修飾的變量。
示例:
#include <iostream>
using namespace std;
void test() {
int a = 10; // 自動(dòng)存儲(chǔ)周期:進(jìn)入test()時(shí)創(chuàng)建,離開(kāi)時(shí)銷毀
cout << "a = " << a << endl;
if (true) {
int b = 20; // 自動(dòng)存儲(chǔ)周期:進(jìn)入if塊時(shí)創(chuàng)建,離開(kāi)if塊時(shí)銷毀
cout << "a + b = " << a + b << endl;
}
// 此處無(wú)法訪問(wèn)b(已銷毀)
}
int main() {
test(); // 第一次調(diào)用test(),創(chuàng)建a和b并使用
test(); // 第二次調(diào)用test(),重新創(chuàng)建a(值仍為10),b重新初始化
return 0;
}注意:自動(dòng)變量的生命周期嚴(yán)格受限于塊的范圍,這意味著遞歸函數(shù)中的局部變量會(huì)在每次遞歸調(diào)用時(shí)創(chuàng)建新的副本,彼此獨(dú)立。
2. 靜態(tài)存儲(chǔ)周期(Static Storage Duration)
定義:變量在程序啟動(dòng)時(shí)(或第一次使用時(shí))被創(chuàng)建,在程序終止時(shí)銷毀,生命周期與整個(gè)程序一致。
核心特性:
- 內(nèi)存位置:存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)(而非?;蚨眩?,該區(qū)域在程序加載時(shí)分配,程序結(jié)束后由操作系統(tǒng)回收。
- 初始化:僅初始化一次(全局變量在
main()前初始化,局部靜態(tài)變量在第一次進(jìn)入塊時(shí)初始化),后續(xù)值會(huì)被保留。 - 適用場(chǎng)景:
- 全局變量(定義在所有函數(shù)外的變量);
- 用
static修飾的局部變量(函數(shù)內(nèi)的靜態(tài)變量); - 類的
static成員變量(屬于類而非對(duì)象)。
示例1:全局變量與局部靜態(tài)變量
#include <iostream>
using namespace std;
int global_var = 0; // 靜態(tài)存儲(chǔ)周期:程序啟動(dòng)時(shí)初始化,終止時(shí)銷毀
void count() {
static int local_static = 0; // 靜態(tài)存儲(chǔ)周期:第一次調(diào)用時(shí)初始化
local_static++;
global_var++;
cout << "local_static: " << local_static << ", global_var: " << global_var << endl;
}
int main() {
count(); // 輸出:local_static: 1, global_var: 1
count(); // 輸出:local_static: 2, global_var: 2
count(); // 輸出:local_static: 3, global_var: 3
return 0;
}解析:global_var在程序啟動(dòng)時(shí)初始化,local_static在第一次調(diào)用count()時(shí)初始化,兩者的值都會(huì)在多次調(diào)用中保留并遞增。
示例2:類的靜態(tài)成員變量
#include <iostream>
using namespace std;
class Student {
public:
static int total; // 類靜態(tài)成員:屬于整個(gè)Student類,所有對(duì)象共享
string name;
Student(string n) : name(n) {
total++; // 每次創(chuàng)建對(duì)象時(shí),total遞增
}
};
int Student::total = 0; // 類外初始化(必須)
int main() {
Student s1("Alice");
Student s2("Bob");
cout << "總學(xué)生數(shù):" << Student::total << endl; // 輸出:2
return 0;
}解析:total是Student類的靜態(tài)成員,所有對(duì)象共享同一內(nèi)存,因此能統(tǒng)計(jì)總實(shí)例數(shù)。
3. 動(dòng)態(tài)存儲(chǔ)周期(Dynamic Storage Duration)
定義:變量的生命周期由程序員手動(dòng)控制,通過(guò)new(或new[])創(chuàng)建,delete(或delete[])銷毀,若未手動(dòng)銷毀會(huì)導(dǎo)致內(nèi)存泄漏。
核心特性:
- 內(nèi)存位置:存儲(chǔ)在堆(heap) 中,堆是一塊需要手動(dòng)管理的內(nèi)存區(qū)域,大小通常遠(yuǎn)大于棧。
- 初始化:通過(guò)
new創(chuàng)建時(shí)可顯式初始化(如new int(5)),未初始化則值為未定義。 - 適用場(chǎng)景:需要?jiǎng)討B(tài)分配大?。ㄈ鐒?dòng)態(tài)數(shù)組)、生命周期需跨越多個(gè)函數(shù)或塊的變量。
示例:
#include <iostream>
using namespace std;
int main() {
// 動(dòng)態(tài)創(chuàng)建單個(gè)變量
int* num = new int(100); // 動(dòng)態(tài)存儲(chǔ)周期:通過(guò)new創(chuàng)建
cout << *num << endl; // 輸出:100
// 動(dòng)態(tài)創(chuàng)建數(shù)組
int* arr = new int[5]{1, 2, 3, 4, 5}; // C++11支持初始化列表
for (int i = 0; i < 5; i++) {
cout << arr[i] << " "; // 輸出:1 2 3 4 5
}
// 手動(dòng)銷毀,避免內(nèi)存泄漏
delete num;
delete[] arr; // 數(shù)組需用delete[]
return 0;
}注意:動(dòng)態(tài)變量的生命周期與作用域無(wú)關(guān),即使指針超出作用域,堆上的內(nèi)存仍需手動(dòng)釋放(否則內(nèi)存泄漏)?,F(xiàn)代C++推薦使用智能指針(unique_ptr、shared_ptr)自動(dòng)管理動(dòng)態(tài)內(nèi)存。
4. 線程存儲(chǔ)周期(Thread-Local Storage Duration)
定義:變量的生命周期與所屬線程一致,線程創(chuàng)建時(shí)變量被初始化,線程結(jié)束時(shí)被銷毀。C++11引入,用于多線程場(chǎng)景下的線程私有數(shù)據(jù)。
核心特性:
- 關(guān)鍵字:
thread_local(可與static或extern結(jié)合,控制鏈接性)。 - 內(nèi)存位置:每個(gè)線程擁有獨(dú)立的變量副本,存儲(chǔ)在各自的線程私有內(nèi)存中。
- 適用場(chǎng)景:多線程中需避免共享狀態(tài)的變量(如線程ID、局部計(jì)數(shù)器)。
示例:
#include <iostream>
#include <thread>
using namespace std;
thread_local int thread_id = 0; // 每個(gè)線程有獨(dú)立副本
void print_id(int id) {
thread_id = id; // 為當(dāng)前線程的副本賦值
cout << "線程" << id << "的thread_id:" << thread_id << endl;
}
int main() {
thread t1(print_id, 1);
thread t2(print_id, 2);
t1.join(); // 等待線程1結(jié)束
t2.join(); // 等待線程2結(jié)束
return 0;
}
// 輸出(順序可能不同):
// 線程1的thread_id:1
// 線程2的thread_id:2解析:thread_id被thread_local修飾,線程1和線程2分別操作自己的副本,互不干擾。
二、作用域(Scope)
作用域指變量名在代碼中可被訪問(wèn)的區(qū)域,即“變量名有效”的范圍。超出作用域后,變量名無(wú)法被引用(但變量的生命周期可能仍在繼續(xù),如靜態(tài)局部變量)。C++定義了五種作用域。
1. 塊作用域(Block Scope)
定義:由{}包圍的代碼塊內(nèi)聲明的變量,作用域從聲明點(diǎn)開(kāi)始,到塊的結(jié)束點(diǎn) } 結(jié)束。
核心特性:
- 嵌套塊:內(nèi)層塊可訪問(wèn)外層塊的變量,但外層塊無(wú)法訪問(wèn)內(nèi)層塊的變量。
- 名稱隱藏:內(nèi)層塊中若聲明與外層塊同名的變量,內(nèi)層變量會(huì)“隱藏”外層變量(通過(guò)
::可訪問(wèn)全局變量)。
示例:
#include <iostream>
using namespace std;
int main() {
int x = 10; // 塊作用域:main函數(shù)內(nèi)可見(jiàn)
cout << "外層x:" << x << endl;
{ // 內(nèi)層塊
int x = 20; // 塊作用域:內(nèi)層塊內(nèi)可見(jiàn),隱藏外層x
int y = 30; // 塊作用域:僅內(nèi)層塊可見(jiàn)
cout << "內(nèi)層x:" << x << ", y:" << y << endl;
}
// cout << y << endl; // 錯(cuò)誤:y超出作用域
cout << "外層x:" << x << endl; // 仍為10(未被內(nèi)層x影響)
return 0;
}2. 函數(shù)作用域(Function Scope)
定義:僅適用于goto語(yǔ)句的標(biāo)簽(label),作用域覆蓋整個(gè)函數(shù),無(wú)論標(biāo)簽聲明在函數(shù)的哪個(gè)位置。
核心特性:
- 標(biāo)簽名在函數(shù)內(nèi)必須唯一,避免沖突。
goto可跳轉(zhuǎn)到函數(shù)內(nèi)任意標(biāo)簽,但不能跨函數(shù)跳轉(zhuǎn)。
示例:
#include <iostream>
using namespace std;
void func() {
cout << "開(kāi)始" << endl;
goto mid; // 跳轉(zhuǎn)到mid標(biāo)簽(盡管mid聲明在后面)
cout << "跳過(guò)的代碼" << endl;
mid: // 標(biāo)簽,作用域覆蓋整個(gè)func()
cout << "中間" << endl;
goto end;
cout << "另一部分跳過(guò)的代碼" << endl;
end: // 標(biāo)簽
cout << "結(jié)束" << endl;
}
int main() {
func();
return 0;
}
// 輸出:
// 開(kāi)始
// 中間
// 結(jié)束3. 函數(shù)原型作用域(Function Prototype Scope)
定義:函數(shù)聲明(原型)中參數(shù)的名稱,作用域僅限于原型本身,與函數(shù)定義中的參數(shù)名無(wú)關(guān)。
核心特性:
- 原型中的參數(shù)名僅用于說(shuō)明參數(shù)含義,可省略(但不推薦,影響可讀性)。
- 原型與定義的參數(shù)名可不同,編譯器僅檢查類型是否匹配。
示例:
#include <iostream>
using namespace std;
// 函數(shù)原型:參數(shù)名a、b的作用域僅限于此原型
void add(int a, int b);
// 函數(shù)定義:參數(shù)名x、y與原型的a、b無(wú)關(guān)
void add(int x, int y) {
cout << x + y << endl;
}
// 原型可省略參數(shù)名(僅保留類型)
void multiply(int, int);
void multiply(int m, int n) {
cout << m * n << endl;
}
int main() {
add(2, 3); // 輸出:5
multiply(2, 3); // 輸出:6
return 0;
}4. 類作用域(Class Scope)
定義:類的成員(成員變量、成員函數(shù)、嵌套類型等)的作用域?yàn)檎麄€(gè)類,需通過(guò)類名或?qū)ο笤L問(wèn)。
核心特性:
- 類內(nèi)成員可直接相互訪問(wèn)(不受訪問(wèn)控制符影響)。
- 類外訪問(wèn)需通過(guò)“對(duì)象.成員”(非靜態(tài)成員)或“類名::成員”(靜態(tài)成員)。
- 訪問(wèn)控制符(
public/private/protected)限制的是訪問(wèn)權(quán)限,而非作用域。
示例:
#include <iostream>
using namespace std;
class Circle {
private:
double radius; // 類作用域:Circle類內(nèi)可見(jiàn)
public:
static const double PI; // 靜態(tài)成員,類作用域
Circle(double r) : radius(r) {} // 構(gòu)造函數(shù),類作用域
double area() { // 成員函數(shù),類作用域
return PI * radius * radius; // 直接訪問(wèn)類內(nèi)成員
}
};
const double Circle::PI = 3.14159; // 類外初始化靜態(tài)成員
int main() {
Circle c(2.0);
cout << "面積:" << c.area() << endl; // 通過(guò)對(duì)象訪問(wèn)非靜態(tài)成員
cout << "PI:" << Circle::PI << endl; // 通過(guò)類名訪問(wèn)靜態(tài)成員
// cout << c.radius << endl; // 錯(cuò)誤:radius是private,無(wú)訪問(wèn)權(quán)限
return 0;
}5. 命名空間作用域(Namespace Scope)
定義:命名空間內(nèi)聲明的實(shí)體(變量、函數(shù)、類等)的作用域?yàn)檎麄€(gè)命名空間,包括嵌套的命名空間。
核心特性:
- 全局命名空間:未被任何命名空間包裹的區(qū)域(如全局變量),作用域?yàn)檎麄€(gè)程序。
- 自定義命名空間:用
namespace定義,可避免名稱沖突(如庫(kù)函數(shù)重名)。 - 訪問(wèn)方式:同命名空間內(nèi)直接訪問(wèn);跨命名空間需用“命名空間名::成員”或
using指令。
示例:
#include <iostream>
using namespace std;
// 全局命名空間
int global = 100;
namespace Math {
const double PI = 3.14; // 自定義命名空間作用域
namespace Arithmetic { // 嵌套命名空間
int add(int a, int b) { return a + b; }
}
}
int main() {
cout << "全局變量:" << global << endl;
cout << "Math::PI:" << Math::PI << endl;
cout << "Math::Arithmetic::add(2,3):" << Math::Arithmetic::add(2,3) << endl;
using namespace Math::Arithmetic; // 引入命名空間,可直接使用add
cout << "add(4,5):" << add(4,5) << endl; // 輸出:9
return 0;
}三、鏈接性(Linkage)
鏈接性描述變量或函數(shù)在多文件程序中的可見(jiàn)性,決定了多個(gè)源文件是否能共享同一實(shí)體。鏈接性僅針對(duì)具有靜態(tài)存儲(chǔ)周期的實(shí)體(自動(dòng)/動(dòng)態(tài)存儲(chǔ)周期的實(shí)體無(wú)鏈接性),分為三種類型。
1. 外部鏈接(External Linkage)
定義:實(shí)體可在多個(gè)源文件中訪問(wèn),所有文件共享同一內(nèi)存地址。
適用場(chǎng)景:
- 全局變量(未被
static修飾); - 非
static的函數(shù); - 類的非
static成員(通過(guò)對(duì)象訪問(wèn)); - 用
extern聲明的變量(顯式指定外部鏈接)。
示例(多文件程序):
文件1:global.cpp
int shared_var = 10; // 外部鏈接:可被其他文件訪問(wèn)
void print() { // 外部鏈接:可被其他文件調(diào)用
cout << "shared_var = " << shared_var << endl;
}文件2:main.cpp
#include <iostream>
using namespace std;
// 聲明外部鏈接的變量和函數(shù)(來(lái)自global.cpp)
extern int shared_var;
extern void print();
int main() {
shared_var = 20; // 修改共享變量
print(); // 輸出:shared_var = 20
return 0;
}解析:shared_var和print()具有外部鏈接,main.cpp通過(guò)extern聲明后可訪問(wèn)global.cpp中的實(shí)體,兩者操作的是同一內(nèi)存。
2. 內(nèi)部鏈接(Internal Linkage)
定義:實(shí)體僅在當(dāng)前文件中可見(jiàn),其他文件無(wú)法訪問(wèn)(即使聲明也不行)。
適用場(chǎng)景:
- 用
static修飾的全局變量; - 用
static修飾的函數(shù); - 未加
extern的const全局變量(C++默認(rèn)內(nèi)部鏈接)。
示例(多文件程序):
文件1:internal.cpp
static int file_var = 100; // 內(nèi)部鏈接:僅file1.cpp可見(jiàn)
static void file_func() { // 內(nèi)部鏈接:僅file1.cpp可見(jiàn)
cout << "file_var = " << file_var << endl;
}文件2:main.cpp
#include <iostream>
using namespace std;
extern int file_var; // 錯(cuò)誤:file_var是內(nèi)部鏈接,無(wú)法跨文件訪問(wèn)
extern void file_func(); // 錯(cuò)誤:file_func是內(nèi)部鏈接
int main() {
// file_func(); // 編譯錯(cuò)誤:未定義引用
return 0;
}解析:file_var和file_func()被static修飾,僅在internal.cpp中可見(jiàn),main.cpp無(wú)法訪問(wèn),避免了多文件中的名稱沖突。
3. 無(wú)鏈接(No Linkage)
定義:實(shí)體僅在自身作用域內(nèi)可見(jiàn),無(wú)法被其他作用域或文件訪問(wèn)。
適用場(chǎng)景:
- 塊作用域內(nèi)的變量(自動(dòng)/靜態(tài)局部變量);
- 函數(shù)參數(shù);
- 類的非靜態(tài)成員(僅屬于對(duì)象,無(wú)跨文件共享意義);
- 命名空間內(nèi)的塊作用域變量。
示例:
#include <iostream>
using namespace std;
namespace Test {
int ns_var = 5; // 外部鏈接(命名空間全局變量)
void func() {
int local = 10; // 無(wú)鏈接:僅func()內(nèi)可見(jiàn)
static int static_local = 0; // 無(wú)鏈接:僅func()內(nèi)可見(jiàn)(靜態(tài)存儲(chǔ)周期)
static_local++;
cout << "local: " << local << ", static_local: " << static_local << endl;
}
}
int main() {
Test::func(); // 輸出:local: 10, static_local: 1
Test::func(); // 輸出:local: 10, static_local: 2
// cout << Test::local << endl; // 錯(cuò)誤:local無(wú)鏈接,超出作用域
return 0;
}四、存儲(chǔ)周期、作用域與鏈接性的關(guān)系
三者是描述變量行為的不同維度,相互關(guān)聯(lián)但獨(dú)立:
| 維度 | 核心含義 | 與其他維度的關(guān)聯(lián) |
|---|---|---|
| 存儲(chǔ)周期 | 變量“活多久”(生命周期) | 靜態(tài)存儲(chǔ)周期的變量可能有外部/內(nèi)部鏈接;自動(dòng)/動(dòng)態(tài)存儲(chǔ)周期的變量一定無(wú)鏈接。 |
| 作用域 | 變量“在哪里可被訪問(wèn)” | 作用域決定鏈接性的可見(jiàn)范圍(如外部鏈接變量的作用域是命名空間,內(nèi)部鏈接是文件)。 |
| 鏈接性 | 變量“能否跨文件共享” | 僅靜態(tài)存儲(chǔ)周期的變量有鏈接性;作用域是鏈接性的“局部化”表現(xiàn)(如文件是特殊的作用域)。 |
典型組合示例:
- 自動(dòng)存儲(chǔ)周期 + 塊作用域 + 無(wú)鏈接:
- 普通局部變量(如
int a = 0;),進(jìn)入塊時(shí)創(chuàng)建,離開(kāi)時(shí)銷毀,僅在塊內(nèi)可見(jiàn),無(wú)法跨文件共享。
- 普通局部變量(如
- 靜態(tài)存儲(chǔ)周期 + 命名空間作用域 + 外部鏈接:
- 全局變量(如
int g = 0;),程序啟動(dòng)時(shí)創(chuàng)建,終止時(shí)銷毀,在所有文件中可見(jiàn)(需extern聲明)。
- 全局變量(如
- 靜態(tài)存儲(chǔ)周期 + 塊作用域 + 無(wú)鏈接:
- 靜態(tài)局部變量(如
static int count = 0;),程序啟動(dòng)時(shí)創(chuàng)建,終止時(shí)銷毀,僅在塊內(nèi)可見(jiàn),無(wú)法跨文件共享。
- 靜態(tài)局部變量(如
- 靜態(tài)存儲(chǔ)周期 + 命名空間作用域 + 內(nèi)部鏈接:
- 靜態(tài)全局變量(如
static int file_g = 0;),程序啟動(dòng)時(shí)創(chuàng)建,終止時(shí)銷毀,僅在當(dāng)前文件可見(jiàn)。
- 靜態(tài)全局變量(如
五、常見(jiàn)誤區(qū)與注意事項(xiàng)
static的多重含義:static在不同場(chǎng)景下含義不同:修飾局部變量時(shí)控制存儲(chǔ)周期(靜態(tài)),修飾全局變量/函數(shù)時(shí)控制鏈接性(內(nèi)部),修飾類成員時(shí)表示“類共享”。
const與鏈接性:- 全局
const變量默認(rèn)具有內(nèi)部鏈接(類似static),若需外部鏈接需顯式加extern(如extern const int x = 5;)。
- 全局
- 靜態(tài)局部變量的線程安全性:
- C++11后,靜態(tài)局部變量的初始化是線程安全的(編譯器保證僅一個(gè)線程執(zhí)行初始化),但后續(xù)修改仍需手動(dòng)加鎖。
- 鏈接性與多重定義:
- 外部鏈接的變量/函數(shù)在多文件中只能定義一次(否則鏈接錯(cuò)誤),但可多次聲明;內(nèi)部鏈接的實(shí)體可在不同文件中重名定義(彼此獨(dú)立)。
存儲(chǔ)周期、作用域與鏈接性共同構(gòu)成了C++變量行為的完整描述:
- 存儲(chǔ)周期回答“變量活多久”,決定內(nèi)存管理方式;
- 作用域回答“變量在哪里可被訪問(wèn)”,控制代碼中的可見(jiàn)范圍;
- 鏈接性回答“變量能否跨文件共享”,支持多文件程序的協(xié)作。
到此這篇關(guān)于C++存儲(chǔ)周期作用域鏈接性詳解的文章就介紹到這了,更多相關(guān)C++存儲(chǔ)周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言標(biāo)準(zhǔn)庫(kù)<math.h>和<setjmp.h>的實(shí)現(xiàn)
本文主要介紹了C語(yǔ)言標(biāo)準(zhǔn)庫(kù)<math.h>和<setjmp.h>的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
C++異步數(shù)據(jù)交換實(shí)現(xiàn)方法介紹
這篇文章主要介紹了C++異步數(shù)據(jù)交換實(shí)現(xiàn)方法,異步數(shù)據(jù)交換,除了阻塞函數(shù) send() 和 recv() 之外,Boost.MPI 還支持與成員函數(shù) isend() 和 irecv() 的異步數(shù)據(jù)交換2022-11-11
C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)鏈表的示例代碼
本文主要介紹了C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)鏈表的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
VC++?2019?"const?char*"類型的實(shí)參與"LPCTSTR"
這篇文章主要給大家介紹了關(guān)于VC++?2019?"const?char*"類型的實(shí)參與"LPCTSTR"類型的形參不兼容的解決方法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03
C++連接mysql數(shù)據(jù)庫(kù)的兩種方法小結(jié)
這篇文章主要介紹了C++連接mysql數(shù)據(jù)庫(kù)的兩種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

