Qt項目實戰(zhàn)之實現(xiàn)多文本編輯器
更新時間:2023年03月17日 08:57:58 作者:音視頻開發(fā)老舅
這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)簡易的多文本編輯器,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以了解一下
首先先來看實驗成果圖,大概就是這么個多文檔編輯器。

首先需要在設計模式里進行設計器的設置:

然后就是新建類MdiChild的聲明和實現(xiàn)
mdichild.h
#ifndef MDICHILD_H
#define MDICHILD_H
#include<QTextEdit>
class MdiChild:public QTextEdit
{
Q_OBJECT
public:
explicit MdiChild(QWidget *parent = 0);
void newFile(); //新建操作
bool loadFile(const QString &fileName); //加載文件
bool save(); //保存操作
bool saveAs(); //另存為操作
bool saveFile(const QString &fileName); //保存文件
QString userFriendlyCurrentFile(); //提取文件名
QString currentFile(){return curFile;} //返回當前文件路徑
protected:
void closeEvent(QCloseEvent *event); //關閉事件
void contextMenuEvent(QContextMenuEvent *e); //右鍵菜單事件
private slots:
void documentWasModified(); //文檔被更改時,窗口顯示更改狀態(tài)標志
private:
bool maybeSave(); //是否需要保存
void setCurrentFile(const QString &fileName); //設置當前文件
QString curFile; //保存當前文件路徑
bool isUntitled; //作為當前文件是否被保存到硬盤上的標志
};
#endif // MDICHILD_H
mdichild.cpp
#include "mdichild.h"
#include<QFile>
#include<QMessageBox>
#include<QTextStream>
#include<QApplication>
#include<QFileInfo>
#include<QFileDialog>
#include<QCloseEvent>
#include<QPushButton>
#include<QMenu>
MdiChild::MdiChild(QWidget *parent):QTextEdit (parent)
{
//設置在子窗口關閉時銷毀這個類的對象
setAttribute(Qt::WA_DeleteOnClose);
//初始isUntitled為true
isUntitled = true;
}
/*
* 設置窗口編號
* 保存文件未被保存過“isUntitled = true”
* 保存文件路徑,給curFile賦初值
* 設置子窗口標題
* 關聯(lián)文檔內(nèi)容改變信號到顯示文檔更改狀態(tài)
*/
void MdiChild::newFile()
{
//設置窗口編號,因為編號一致被保存,所以需要使用靜態(tài)變量
static int sequenceNumber =1;
//新建的文檔沒有被保存過
isUntitled =true;
//將當前文件命名為未命名文檔加編號,編號先使用再加1
curFile = tr("未命名文檔%1.txt").arg(sequenceNumber++);
//設置窗口標題,使用[*]可以再文檔被更改后再文件名稱后顯示“*”號
setWindowTitle(curFile +"[*]"+tr(" - 多文檔編輯器"));
//文檔更改時發(fā)射contentsChanged()信號,執(zhí)行documentWasModified()槽
connect(document(),SIGNAL(contentsChanged()),this,SLOT(documentWasModified()));
}
/*
* 打開指定的文件,并讀取文件內(nèi)容到編輯器
* 設置當前文件setCurrentFile(),該函數(shù)可以獲取文件路徑,完成文件和窗口狀態(tài)的設置
* 關聯(lián)文檔內(nèi)容改變信號到顯示文檔更改狀態(tài)槽documentWasModified()
*/
bool MdiChild::loadFile(const QString &fileName)
{
//新建QFile對象
QFile file(fileName);
//只讀方式打開文件,出錯則提示,并返回false
if(!file.open(QFile::ReadOnly|QFile::Text))
{
QMessageBox::warning(this,tr("多文檔編輯器"),tr("無法讀取文件%1:\n%2.").arg(fileName).arg(file.errorString()));
return false;
}
//新建文本流對象
QTextStream in(&file);
//設置鼠標狀態(tài)為等待狀態(tài)
QApplication::setOverrideCursor(Qt::WaitCursor);
//讀取文件的全部文本內(nèi)容,并添加到編輯器中
setPlainText(in.readAll());
//恢復鼠標狀態(tài)
QApplication::restoreOverrideCursor();
//設置當前文件
setCurrentFile(fileName);
connect(document(),SIGNAL(contentsChanged()),this,SLOT(documentWasChanged()));
return true;
}
bool MdiChild::save()
{
//如果文件未被保存過,則執(zhí)行另存為操作,否則直接保存文件
if(isUntitled)
{
return saveAs();
}
else {
return saveFile(curFile);
}
}
bool MdiChild::saveAs()
{
QString fileName = QFileDialog::getSaveFileName(this,tr("另存為"),curFile);
//獲取文件路徑,如果為空,則返回false,否則保存文件
if(fileName.isEmpty())
return false;
return saveFile(fileName);
}
bool MdiChild::saveFile(const QString &fileName)
{
QFile file(fileName);
if(!file.open(QFile::WriteOnly|QFile::Text))
{
QMessageBox::warning(this,tr("多文檔編輯器"),tr("無法寫入文件%1:\n%2").arg(fileName).arg(file.errorString()));
return false;
}
QTextStream out(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
//以純文本文件寫入
out<<toPlainText();
QApplication::restoreOverrideCursor();
setCurrentFile(fileName);
}
QString MdiChild::userFriendlyCurrentFile()
{
//從文件路徑中提取文件名
return QFileInfo(curFile).fileName();
}
void MdiChild::closeEvent(QCloseEvent *event)
{
//如果maybeSave()函數(shù)返回true,則關閉窗口,否則忽略該事件
if(maybeSave())
{
event->accept();
}
else {
event->ignore();
}
}
void MdiChild::contextMenuEvent(QContextMenuEvent *e)
{
//創(chuàng)建菜單,并向其中添加動作
QMenu *menu = new QMenu;
QAction *undo =menu->addAction(tr("撤銷(&U)"),this,SLOT(undo()),QKeySequence::Undo);
undo->setEnabled(document()->isUndoAvailable());
QAction *redo =menu->addAction(tr("恢復(&R)"),this,SLOT(redo()),QKeySequence::Redo);
redo->setEnabled((document()->isRedoAvailable()));
menu->addSeparator();
QAction *cut =menu->addAction(tr("剪切(&T)"),this,SLOT(cut()),QKeySequence::Cut);
cut->setEnabled(textCursor().hasSelection());
QAction *copy = menu->addAction(tr("復制(&C)"),this,SLOT(copy()),QKeySequence::Copy);
copy->setEnabled(textCursor().hasSelection());
QAction *clear = menu->addAction(tr("清空"),this,SLOT(clear()));
clear->setEnabled(!document()->isEmpty());
menu->addSeparator();
QAction *select = menu->addAction(tr("全選"),this,SLOT(selectAll()),QKeySequence::SelectAll);
select->setEnabled(!document()->isEmpty());
//獲取鼠標的位置,然后在這個位置顯示菜單
menu->exec(e->globalPos());
//最后銷毀這個菜單
delete menu;
}
void MdiChild::documentWasModified()
{
//根據(jù)文檔的isModified()函數(shù)的返回值,判斷編輯器內(nèi)容是否被更改了
//如果被更改了,就要在設置[*]號的地方顯示“*”號,這里會在窗口標題中顯示
setWindowModified(document()->isModified());
}
bool MdiChild::maybeSave()
{
//如果文檔被更改過
if(document()->isModified())
{
QMessageBox box;
box.setWindowTitle(tr("多文檔編輯器"));
box.setText(tr("是否保存為“%1”的更改?").arg(userFriendlyCurrentFile()));
box.setIcon(QMessageBox::Warning);
//添加按鈕,QMessageBox::YesRole可以表明這個按鈕的行為
QPushButton *yesBtn = box.addButton(tr("是(&Y)"),QMessageBox::YesRole);
box.addButton(tr("否(&N)"),QMessageBox::NoRole);
QPushButton *cancelBtn = box.addButton(tr("取消"),QMessageBox::RejectRole);
//彈出對話框,讓用戶選擇是否保存修改,或者取消關閉操作
box.exec();
//如果用戶選擇是,則返回保存操作的結(jié)果;如果選擇取消,則返回false
if(box.clickedButton() ==yesBtn)
return save();
else if(box.clickedButton() ==cancelBtn){
return false;
}
}
//如果文檔沒有更改過,則直接返回true;
return true;
}
void MdiChild::setCurrentFile(const QString &fileName)
{
//canonicalFilePath()可以除去路徑中的符號鏈接,"."和".."等符號
curFile = QFileInfo(fileName).canonicalFilePath();
//文件已經(jīng)被保存過了
isUntitled = false;
//文檔沒有被更改過
document()->setModified(false);
//窗口不顯示被更改標志
setWindowModified(false);
//設置窗口標題,userFriendlyCurrentFile()返回文件名
setWindowTitle(userFriendlyCurrentFile()+"[*]");
}
然后是mainwindow類的聲明與實現(xiàn)
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class QMdiSubWindow;
class MdiChild;
class QSignalMapper;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void updateMenus(); //更新菜單
MdiChild* createMdiChild(); //創(chuàng)建子窗口
void setActiveSubWindow(QWidget *window); //設置活動子窗口
void updateWindowMenu(); //更新窗口菜單
void showTextRowAndCol(); //顯示文本的行號和列號
void on_actionNew_triggered();
void on_actionOpen_triggered();
void on_actionSave_triggered();
void on_actionSaveAs_triggered();
void on_actionUndo_triggered();
void on_actionRedo_triggered();
void on_actionCut_triggered();
void on_actionCopy_triggered();
void on_actionPaste_triggered();
void on_actionClose_triggered();
void on_actionCloseAll_triggered();
void on_actionAbout_triggered();
void on_actionAboutQt_triggered();
void on_actionExit_triggered();
private:
QMdiSubWindow *findMdiChild(const QString &fileName);//查找子窗口
void readSettings(); //讀取窗口設置
void writeSettings(); //寫入窗口設置
void initWindow(); //初始化窗口
protected:
void closeEvent(QCloseEvent* event); //關閉事件
private:
Ui::MainWindow *ui;
QAction *actionSeparator; //間隔器
MdiChild *activeMdiChild(); //活動窗口
QSignalMapper *windowMapper; //信號映射器
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"mdichild.h"
#include<QFileDialog>
#include<QMdiSubWindow>
#include<QSignalMapper>
#include<QMessageBox>
#include<QSettings>
#include<QCloseEvent>
#include<QLabel>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
/*
* 初始化actionSeparator動作,然后執(zhí)行更新菜單函數(shù),并關聯(lián)多文檔區(qū)域的活動子窗口信號到更新菜單槽上
* 每當更換子窗口時,都會更新菜單狀態(tài)
*/
//創(chuàng)建間隔期動作并在其中設置間隔期
actionSeparator = new QAction(this);
actionSeparator->setSeparator(true);
//更新菜單
updateMenus();
//當有活動窗口時更新菜單
connect(ui->mdiArea,SIGNAL(subWindowActivated(QMdiSubWindow*)),this,SLOT(updateMenus()));
//創(chuàng)建信號映射器
windowMapper = new QSignalMapper(this);
//映射器重新發(fā)射信號,更具信號設置活動窗口
connect(windowMapper,SIGNAL(mapped(QWidget *)),this,SLOT(setActiveSubWindow(QWidget *)));
//更新窗口菜單,并且設置當窗口菜單將要顯示的時候更新窗口菜單
updateWindowMenu();
connect(ui->menu_W,SIGNAL(aboutToShow()),this,SLOT(updateWindowMenu()));
readSettings(); //初始窗口時讀取窗口設置信息
//初始化窗口
initWindow();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_actionNew_triggered()
{
//創(chuàng)建MdiChild
MdiChild *child = createMdiChild();
//新建文件
child->newFile();
//顯示子窗口
child->show();
}
/*
* 更新菜單函數(shù):根據(jù)是否有活動子窗口設置各個菜單動作是否可用
* 這里剪切復制操作和撤銷恢復操作的設置還要進行特殊情況的判斷
*/
void MainWindow::updateMenus()
{
//根據(jù)是否有活動窗口來設置各個動作是否可用
bool hasMdiChild = (activeMdiChild()!= 0);
ui->actionSave->setEnabled(hasMdiChild);
ui->actionSaveAs->setEnabled(hasMdiChild);
ui->actionPaste->setEnabled(hasMdiChild);
ui->actionClose->setEnabled(hasMdiChild);
ui->actionCloseAll->setEnabled(hasMdiChild);
ui->actionTile->setEnabled(hasMdiChild);
ui->actionCascade->setEnabled(hasMdiChild);
ui->actionNext->setEnabled(hasMdiChild);
ui->actionPrevious->setEnabled(hasMdiChild);
//有活動窗口且有被選擇的文本,剪切復制才可用
bool hasSelection =(activeMdiChild() &&activeMdiChild()->textCursor().hasSelection());
ui->actionCut->setEnabled(hasSelection);
ui->actionPaste->setEnabled(hasSelection);
//有活動窗口且有撤銷操作時撤銷動作可用
ui->actionUndo->setEnabled(activeMdiChild()&&activeMdiChild()->document()->isUndoAvailable());
//有活動窗口且文檔有恢復操作時恢復動作可用
ui->actionRedo->setEnabled(activeMdiChild()&&activeMdiChild()->document()->isRedoAvailable());
}
/*
* 這個函數(shù)中創(chuàng)建了MdiChild部件,并將它作為子窗口的中心部件,然后添加到多文檔區(qū)域。
* 下面關聯(lián)了編輯器的信號和我們的菜單動作,讓它們可以隨著文檔的改變而改變狀態(tài)
* 最后返回了MdiChild對象指針。
* 之所以要添加這樣一個函數(shù),是因為在下面的打開操作中還要使用到這個函數(shù)中的功能,所以將它們從新建文件菜單的觸發(fā)信號槽中提取出來,另寫了這樣一個函數(shù)
*/
MdiChild *MainWindow::createMdiChild()
{
//創(chuàng)建MdiChild部件
MdiChild *child = new MdiChild;
//向多文檔區(qū)域添加子窗口,child為中心部件
ui->mdiArea->addSubWindow(child);
//根據(jù)QTextEdit類的是否可以復制信號設置剪切復制動作是否可用
connect(child,SIGNAL(copyAvailable(bool)),ui->actionCut,SLOT(setEnabled(bool)));
connect(child,SIGNAL(copyAvailable(bool)),ui->actionCopy,SLOT(setEnabled(bool)));
//根據(jù)QTextDocument類的是否可以撤銷恢復信號設置撤銷恢復動作是否可用
connect(child->document(),SIGNAL(undoAvailable(bool)),ui->actionUndo,SLOT(setEnabled(bool)));
connect(child->document(),SIGNAL(redoAvailable(bool)),ui->actionRedo,SLOT(setEnabled(bool)));
connect(child,SIGNAL(cursorPositionChanged()),this,SLOT(showTextRowAndCol()));
return child;
}
/*
* 函數(shù)功能:將傳遞過來的窗口部件設置為活動窗口
*/
void MainWindow::setActiveSubWindow(QWidget *window)
{
//如果傳遞了窗口部件,則將其設置為活動窗口
if(!window)
return;
ui->mdiArea->setActiveSubWindow(qobject_cast<QMdiSubWindow*>(window));
}
void MainWindow::on_actionOpen_triggered()
{
//獲取文件路勁
QString fileName = QFileDialog::getOpenFileName(this);
//如果路徑不為空,則查看該文件是否已經(jīng)打開
if(!fileName.isEmpty())
{
QMdiSubWindow *existing = findMdiChild(fileName);
//如果已經(jīng)存在,則將對應的子窗口設置為活動窗口
if(existing)
{
ui->mdiArea->setActiveSubWindow(existing);
return;
}
//如果沒有打開,則新建子窗口
MdiChild *child = createMdiChild();
if(child->loadFile(fileName))
{
ui->statusBar->showMessage(tr("打開文件成功"),2000);
child->show();
}
else {
child->close();
}
}
}
void MainWindow::updateWindowMenu()
{
//先清空菜單,然后在添加各個菜單動作
ui->menu_W->clear();
ui->menu_W->addAction(ui->actionClose);
ui->menu_W->addAction(ui->actionCloseAll);
ui->menu_W->addSeparator();
ui->menu_W->addAction(ui->actionTile);
ui->menu_W->addAction(ui->actionCascade);
ui->menu_W->addSeparator();
ui->menu_W->addAction(ui->actionNext);
ui->menu_W->addAction(ui->actionPrevious);
ui->menu_W->addAction(actionSeparator);
//如果有活動窗口,則顯示間隔器
QList<QMdiSubWindow*> windows =ui->mdiArea->subWindowList();
actionSeparator->setVisible(!windows.isEmpty());
//遍歷各個子窗口
for(int i=0;i<windows.size();++i)
{
MdiChild *child = qobject_cast<MdiChild*>(windows.at(i)->widget());
QString text;
//如果窗口數(shù)小于9,則設置編號為快捷鍵
if(i<9)
{
text=tr("&%1 %2").arg(i+1).arg(child->userFriendlyCurrentFile());
}
else {
text=tr("%1 %2").arg(i+1).arg(child->userFriendlyCurrentFile());
}
//添加動作到菜單,設置動作可以選擇
QAction *action = ui->menu_W->addAction(text);
action->setCheckable(true);
//設置當前活動窗口動作為選中狀態(tài)
action->setChecked(child ==activeMdiChild());
//關聯(lián)動作的觸發(fā)信號到信號映射器的map()槽,這個槽會發(fā)射mapped()信號
connect(action,SIGNAL(triggered()),windowMapper,SLOT(map()));
//將動作與相應的窗口部件進行映射
//在發(fā)射mappedd()信號時就會以這個窗口部件為參數(shù)
windowMapper->setMapping(action,windows.at(i));
}
}
void MainWindow::showTextRowAndCol()
{
//如果有活動窗口,則顯示其中光標所在的位置
if(activeMdiChild())
{
//因為獲取的行號和列號都是從0開始的,所以我們這里進行了加1
int rowNum = activeMdiChild()->textCursor().blockNumber()+1;
int colNum = activeMdiChild()->textCursor().blockNumber()+1;
ui->statusBar->showMessage(tr("%1行 %2列").arg(rowNum).arg(colNum),2000);
}
}
QMdiSubWindow *MainWindow::findMdiChild(const QString &fileName)
{
QString canonicalFilePath = QFileInfo(fileName).canonicalFilePath();
//利用foreach語句遍歷子窗口列表,如果其文件路徑和要查找的路徑相同,則返回該窗口
foreach(QMdiSubWindow* window,ui->mdiArea->subWindowList())
{
MdiChild* mdiChild = qobject_cast<MdiChild*>(window->widget());
if(mdiChild->currentFile() ==canonicalFilePath)
return window;
}
return 0;
}
void MainWindow::readSettings()
{
QSettings settings("yafeilinux","myMdi");
QPoint pos =settings.value("pos",QPoint(200,200)).toPoint();
QSize size =settings.value("size",QSize(400,200)).toSize();
move(pos);
resize(size);
}
void MainWindow::writeSettings()
{
QSettings settings("yafeilinux","myMdi");
//寫入位置信息和大小
settings.setValue("pos",pos());
settings.setValue("size",size());
}
void MainWindow::initWindow()
{
setWindowTitle(tr("多文檔編輯器"));
//在工具欄右擊時,可以關閉該工具欄
ui->mainToolBar->setWindowTitle(tr("工具欄"));
//當多文檔區(qū)域的內(nèi)容超出可是區(qū)域后,出現(xiàn)滾動條
ui->mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
ui->mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
ui->statusBar->showMessage(tr("歡迎使用多文檔編輯器"));
QLabel *label =new QLabel(this);
label->setFrameStyle(QFrame::Box|QFrame::Sunken);
label->setText(tr("<a href=\"http://www.yafeilinux.com\">yafeilinux.com</a>"));
//標簽文字為富文本
label->setTextFormat(Qt::RichText);
//可以打開外部鏈接
label->setOpenExternalLinks(true);
ui->statusBar->addPermanentWidget(label);
ui->actionNew->setStatusTip(tr("創(chuàng)建一個文件"));
ui->actionOpen->setStatusTip(tr("打開一個文件"));
}
void MainWindow::closeEvent(QCloseEvent *event)
{
//先執(zhí)行多文檔區(qū)域的關閉操作
ui->mdiArea->closeAllSubWindows();
//如果還有窗口沒有關閉,則忽略該事件
if(ui->mdiArea->currentSubWindow())
event->ignore();
else {
//在關閉前寫入窗口設置
writeSettings();
event->accept();
}
}
/*
* 這個函數(shù)中使用了QMdiArea類的activeSubWindow()函數(shù)來獲得多文檔區(qū)域的活動子窗口,
* 然后使用了T qobject_cast()函數(shù)來進行類型轉(zhuǎn)換。這個函數(shù)時QObject類的函數(shù),它將object對象指針轉(zhuǎn)換為T類型的對象指針
* 這里將活動窗口的中心部件QWidget類型指針轉(zhuǎn)換為MdiChild類型的指針
* 這里的T類型必須是直接或者間接繼承自QObject類,并且在其定義中要有Q_OBJECT宏變量
*/
MdiChild *MainWindow::activeMdiChild()
{
//如果有活動窗口,則將其內(nèi)的中心部件轉(zhuǎn)換為MdiChild類型,沒有則直接返回0
if(QMdiSubWindow *activeSubWindow = ui->mdiArea->activeSubWindow())
return qobject_cast<MdiChild*>(activeSubWindow->widget());
return 0;
}
void MainWindow::on_actionSave_triggered()
{
if(activeMdiChild()&&activeMdiChild()->save())
ui->statusBar->showMessage(tr("文件保存成功"),2000);
}
void MainWindow::on_actionSaveAs_triggered()
{
if(activeMdiChild()&&activeMdiChild()->saveAs())
ui->statusBar->showMessage(tr("文件保存成功"),2000);
}
void MainWindow::on_actionUndo_triggered()
{
if(activeMdiChild())
activeMdiChild()->undo();
}
void MainWindow::on_actionRedo_triggered()
{
if(activeMdiChild())
activeMdiChild()->redo();
}
void MainWindow::on_actionCut_triggered()
{
if(activeMdiChild())
activeMdiChild()->cut();
}
void MainWindow::on_actionCopy_triggered()
{
if(activeMdiChild())
activeMdiChild()->copy();
}
void MainWindow::on_actionPaste_triggered()
{
if(activeMdiChild())
activeMdiChild()->paste();
}
void MainWindow::on_actionClose_triggered()
{
ui->mdiArea->closeActiveSubWindow();
}
void MainWindow::on_actionCloseAll_triggered()
{
ui->mdiArea->closeAllSubWindows();
}
void MainWindow::on_actionAbout_triggered()
{
QMessageBox::about(this,"關于",tr("致力于多文檔編輯器普及工作"));
}
void MainWindow::on_actionAboutQt_triggered()
{
QMessageBox::about(this,"關于Qt",tr("Qt是一個1991年由Qt Company開發(fā)的跨平臺C++圖形用戶界面應用程序開發(fā)框架。它既可以開發(fā)GUI程序,也可用于開發(fā)非GUI程序,比如控制臺工具和服務器。Qt是面向?qū)ο蟮目蚣埽褂锰厥獾拇a生成擴展(稱為元對象編譯器(Meta Object Compiler, moc))以及一些宏,Qt很容易擴展,并且允許真正地組件編程。"));
}
void MainWindow::on_actionExit_triggered()
{
//等價于QApplication::closeAllWindows();
qApp->closeAllWindows();
}
最后是main函數(shù)
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
以上就是Qt項目實戰(zhàn)之實現(xiàn)多文本編輯器的詳細內(nèi)容,更多關于Qt多文本編輯器的資料請關注腳本之家其它相關文章!
相關文章
C語言中的long型究竟占4個字節(jié)還是8個字節(jié)(遇到的坑)
小編在復習C語言的時候踩到了不少坑,糾結(jié)long類型究竟占4個字節(jié)還是8個字節(jié)呢?好,今天通過本文給大家分享下我的詳細思路,感興趣的朋友跟隨小編一起看看吧2021-11-11

