關於leveldb源碼整理之一

前言

最近換工作需要用CPP,不得已學了點,但是越學越覺得難,這裏就找到一個簡單的源碼,自己看下一般編寫c、cpp需要注意的細節。當然基本的面相對象的一些特點,以及指針啥的,這裏過於基礎的就不多說。主要還是自己的總結,這裏不是分析源碼,這裏主要是分析語法。

正文

實在無從下手。看了兩天的makefile,這裏還是主要介紹下makefile的一些東西吧,裏面相對比較複雜的地方是:

# detect what platform we're building on
$(shell CC="$(CC)" CXX="$(CXX)" TARGET_OS="$(TARGET_OS)" \
    ./build_detect_platform build_config.mk ./)
# this file is generated by the previous line to set build flags and sources
include build_config.mk

這裏shell其實新開一個shell腳本,傳入變量,編譯器和操作系統。然後纔開始貌似是用子shell,可以共享變量的方法,傳入值,這裏我們還是看下子shell腳本-build_detect_platform
這個傢伙,前面很簡單,這裏就不詳細介紹,我麼看最後很有意思。

echo "CC=$CC" >> $OUTPUT
echo "CXX=$CXX" >> $OUTPUT
echo "PLATFORM=$PLATFORM" >> $OUTPUT
echo "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> $OUTPUT
echo "PLATFORM_LIBS=$PLATFORM_LIBS" >> $OUTPUT
echo "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> $OUTPUT
echo "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> $OUTPUT
echo "PLATFORM_SSEFLAGS=$PLATFORM_SSEFLAGS" >> $OUTPUT
echo "PLATFORM_SHARED_CFLAGS=$PLATFORM_SHARED_CFLAGS" >> $OUTPUT
echo "PLATFORM_SHARED_EXT=$PLATFORM_SHARED_EXT" >> $OUTPUT
echo "PLATFORM_SHARED_LDFLAGS=$PLATFORM_SHARED_LDFLAGS" >> $OUTPUT
echo "PLATFORM_SHARED_VERSIONED=$PLATFORM_SHARED_VERSIONED" >> 

這裏輸出一大堆東西,進入一個,通過>>>將輸出寫入一個文件,這個就是我們需要 include的一個文件,這裏OUTPUT到底是啥,我也說不太清楚,shell腳本暫時不tai懂,反正就是將內容寫入到build_config.mk中。
這裏我們得到我想要的東西,
我們可以看下這個生成的文件,我這裏用的win10下的unbutu子系統:

SOURCES=db/builder.cc db/c.cc db/dbformat.cc db/db_impl.cc db/db_iter.cc db/dumpfile.cc db/filename.cc db/log_reader.cc db/log_writer.cc db/memtable.cc db/repair.cc db/table_cache.cc db/version_edit.cc db/version_set.cc db/write_batch.cc table/block_builder.cc table/block.cc table/filter_block.cc table/format.cc table/iterator.cc table/merger.cc table/table_builder.cc table/table.cc table/two_level_iterator.cc util/arena.cc util/bloom.cc util/cache.cc util/coding.cc util/comparator.cc util/crc32c.cc util/env.cc util/env_posix.cc util/filter_policy.cc util/hash.cc util/histogram.cc util/logging.cc util/options.cc util/status.cc  port/port_posix.cc port/port_posix_sse.cc
MEMENV_SOURCES=helpers/memenv/memenv.cc
CC=cc
CXX=g++
PLATFORM=OS_LINUX
PLATFORM_LDFLAGS=-pthread
PLATFORM_LIBS=
PLATFORM_CCFLAGS= -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT
PLATFORM_CXXFLAGS=-std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT
PLATFORM_SSEFLAGS=-msse4.2 -DLEVELDB_PLATFORM_POSIX_SSE
PLATFORM_SHARED_CFLAGS=-fPIC
PLATFORM_SHARED_EXT=so
PLATFORM_SHARED_LDFLAGS=-shared -Wl,-soname -Wl,
PLATFORM_SHARED_VERSIONED=true

其實熟悉makefile的童鞋應該就知道,source纔是關鍵,現在得到所有需要的編譯的文件,我們換了後綴,就得到了所有的目標文件,這裏注意source就可以了。
繼續找我們的
終極目標—-all
這是makefile的原則,all的目標就是這個執行make的目標,
很容易找到:

all: $(SHARED_LIBS) $(SHARED_PROGRAMS) $(STATIC_OUTDIR)/libleveldb.a $(STATIC_OUTDIR)/libmemenv.a $(STATIC_PROGRAMS)

是不是覺得很崩潰,這都是啥啊!!我們只要知道,我們還是慢慢的找到這些傢伙到底是幹啥的,一個一個來,
先找到share_libs,他的生成規則:

# Update db.h if you change these.
SHARED_VERSION_MAJOR = 1
SHARED_VERSION_MINOR = 20
SHARED_LIB1 = libleveldb.$(PLATFORM_SHARED_EXT)
SHARED_LIB2 = $(SHARED_LIB1).$(SHARED_VERSION_MAJOR)
SHARED_LIB3 = $(SHARED_LIB1).$(SHARED_VERSION_MAJOR).$(SHARED_VERSION_MINOR)
SHARED_LIBS = $(SHARED_OUTDIR)/$(SHARED_LIB1) $(SHARED_OUTDIR)/$(SHARED_LIB2) $(SHARED_OUTDIR)/$(SHARED_LIB3)

這裏得到的三個目標其實是真個工程的終極目標,這個應該是makefile最後開始編譯的步驟。那麼我看這個三個目標是啥第一個libleveldb.so,liblevedb.so.1,libleveldb.so.1.2,這裏我們就需要找到生成目標的規則了。

$(SHARED_OUTDIR)/$(SHARED_LIB1): $(SHARED_OUTDIR)/$(SHARED_LIB3)
    ln -fs $(SHARED_LIB3) $(SHARED_OUTDIR)/$(SHARED_LIB1)
$(SHARED_OUTDIR)/$(SHARED_LIB2): $(SHARED_OUTDIR)/$(SHARED_LIB3)
    ln -fs $(SHARED_LIB3) $(SHARED_OUTDIR)/$(SHARED_LIB2)
SHARED_MEMENVLIB = $(SHARED_OUTDIR)/libmemenv.a
endif

$(SHARED_OUTDIR)/$(SHARED_LIB3): $(SHARED_LIBOBJECTS)
    $(CXX) $(LDFLAGS) $(PLATFORM_SHARED_LDFLAGS)$(SHARED_LIB2) $(SHARED_LIBOBJECTS) -o $(SHARED_OUTDIR)/$(SHARED_LIB3) $(LIBS)

這裏很容易發現,前兩個都是浮雲。第三個纔是真正的目標。那麼我們就看下第三個目標是如何生成的,
出去flag。和等於空的libs,這裏基本就是通過編譯SHARED_LIBOBJECTS

SHARED_LIBOBJECTS := $(addprefix $(SHARED_OUTDIR)/, $(SOURCES:.cc=.o))

這裏看到了,所有的都是通過編譯source中,吧後綴換成.o的文件。
這裏還有一個問題,這些.o文件是自動生成的嗎?我們還是看下我們的依賴,這些東西在其他地方使用了嗎?事實上使用了,另外一個依賴,這裏

SHARED_ALLOBJS := $(SHARED_LIBOBJECTS) $(SHARED_MEMENVOBJECTS) $(TESTHARNESS)
$(SHARED_ALLOBJS): | SHARED_OBJDIRS
$(SHARED_OUTDIR):
    mkdir $@

$(SHARED_OUTDIR)/db: | $(SHARED_OUTDIR)
    mkdir $@

$(SHARED_OUTDIR)/helpers/memenv: | $(SHARED_OUTDIR)
    mkdir -p $@

$(SHARED_OUTDIR)/port: | $(SHARED_OUTDIR)
    mkdir $@

$(SHARED_OUTDIR)/table: | $(SHARED_OUTDIR)
    mkdir $@

$(SHARED_OUTDIR)/util: | $(SHARED_OUTDIR)
    mkdir $@

.PHONY: SHARED_OBJDIRS
SHARED_OBJDIRS: \
    $(SHARED_OUTDIR)/db \
    $(SHARED_OUTDIR)/port \
    $(SHARED_OUTDIR)/table \
    $(SHARED_OUTDIR)/util \
    $(SHARED_OUTDIR)/helpers/memenv

所以說包括我們的SHARED_LIBOBJECTS 這個也是依賴於SHARED_OBJDIRS 這這個依賴是幾個目錄。關於.o文件如何自己生成的,

$(SIMULATOR_OUTDIR)/%.o: %.cc
    xcrun -sdk iphonesimulator $(CXX) $(CXXFLAGS) $(SIMULATOR_CFLAGS) -c $< -o $@

$(DEVICE_OUTDIR)/%.o: %.cc
    xcrun -sdk iphoneos $(CXX) $(CXXFLAGS) $(DEVICE_CFLAGS) -c $< -o $@

$(SIMULATOR_OUTDIR)/%.o: %.c
    xcrun -sdk iphonesimulator $(CC) $(CFLAGS) $(SIMULATOR_CFLAGS) -c $< -o $@

$(DEVICE_OUTDIR)/%.o: %.c
    xcrun -sdk iphoneos $(CC) $(CFLAGS) $(DEVICE_CFLAGS) -c $< -o $@

$(STATIC_OUTDIR)/%.o: %.cc
    $(CXX) $(CXXFLAGS) -c $< -o $@

$(STATIC_OUTDIR)/%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

$(SHARED_OUTDIR)/%.o: %.cc
    $(CXX) $(CXXFLAGS) $(PLATFORM_SHARED_CFLAGS) -c $< -o $@

$(SHARED_OUTDIR)/%.o: %.c
    $(CC) $(CFLAGS) $(PLATFORM_SHARED_CFLAGS) -c $< -o $@

$(STATIC_OUTDIR)/port/port_posix_sse.o: port/port_posix_sse.cc
    $(CXX) $(CXXFLAGS) $(PLATFORM_SSEFLAGS) -c $< -o $@

$(SHARED_OUTDIR)/port/port_posix_sse.o: port/port_posix_sse.cc
    $(CXX) $(CXXFLAGS) $(PLATFORM_SHARED_CFLAGS) $(PLATFORM_SSEFLAGS) -c $< -o $@

這裏是 關於.o生成的腳本,其他的test得生成,這裏就不介紹了都是一個樣子,下面是運行make後執行的結果,可以參考makefile的結構。自己參考。

mkdir out-shared
mkdir out-shared/db
mkdir out-shared/port
mkdir out-shared/table
mkdir out-shared/util
mkdir -p out-shared/helpers/memenv
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/builder.cc -o out-shared/db/builder.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/c.cc -o out-shared/db/c.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/dbformat.cc -o out-shared/db/dbformat.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/db_impl.cc -o out-shared/db/db_impl.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/db_iter.cc -o out-shared/db/db_iter.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/dumpfile.cc -o out-shared/db/dumpfile.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/filename.cc -o out-shared/db/filename.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/log_reader.cc -o out-shared/db/log_reader.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/log_writer.cc -o out-shared/db/log_writer.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/memtable.cc -o out-shared/db/memtable.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/repair.cc -o out-shared/db/repair.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/table_cache.cc -o out-shared/db/table_cache.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/version_edit.cc -o out-shared/db/version_edit.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/version_set.cc -o out-shared/db/version_set.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/write_batch.cc -o out-shared/db/write_batch.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/block_builder.cc -o out-shared/table/block_builder.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/block.cc -o out-shared/table/block.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/filter_block.cc -o out-shared/table/filter_block.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/format.cc -o out-shared/table/format.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/iterator.cc -o out-shared/table/iterator.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/merger.cc -o out-shared/table/merger.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/table_builder.cc -o out-shared/table/table_builder.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/table.cc -o out-shared/table/table.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/two_level_iterator.cc -o out-shared/table/two_level_iterator.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/arena.cc -o out-shared/util/arena.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/bloom.cc -o out-shared/util/bloom.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/cache.cc -o out-shared/util/cache.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/coding.cc -o out-shared/util/coding.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/comparator.cc -o out-shared/util/comparator.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/crc32c.cc -o out-shared/util/crc32c.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/env.cc -o out-shared/util/env.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/env_posix.cc -o out-shared/util/env_posix.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/filter_policy.cc -o out-shared/util/filter_policy.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/hash.cc -o out-shared/util/hash.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/histogram.cc -o out-shared/util/histogram.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/logging.cc -o out-shared/util/logging.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/options.cc -o out-shared/util/options.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/status.cc -o out-shared/util/status.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c port/port_posix.cc -o out-shared/port/port_posix.o
g++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -msse4.2 -DLEVELDB_PLATFORM_POSIX_SSE -c port/port_posix_sse.cc -o out-shared/port/port_posix_sse.o
g++ -pthread -shared -Wl,-soname -Wl,libleveldb.so.1 out-shared/db/builder.o out-shared/db/c.o out-shared/db/dbformat.o out-shared/db/db_impl.o out-shared/db/db_iter.o out-shared/db/dumpfile.o out-shared/db/filename.o out-shared/db/log_reader.o out-shared/db/log_writer.o out-shared/db/memtable.o out-shared/db/repair.o out-shared/db/table_cache.o out-shared/db/version_edit.o out-shared/db/version_set.o out-shared/db/write_batch.o out-shared/table/block_builder.o out-shared/table/block.o out-shared/table/filter_block.o out-shared/table/format.o out-shared/table/iterator.o out-shared/table/merger.o out-shared/table/table_builder.o out-shared/table/table.o out-shared/table/two_level_iterator.o out-shared/util/arena.o out-shared/util/bloom.o out-shared/util/cache.o out-shared/util/coding.o out-shared/util/comparator.o out-shared/util/crc32c.o out-shared/util/env.o out-shared/util/env_posix.o out-shared/util/filter_policy.o out-shared/util/hash.o out-shared/util/histogram.o out-shared/util/logging.o out-shared/util/options.o out-shared/util/status.o out-shared/port/port_posix.o out-shared/port/port_posix_sse.o -o out-shared/libleveldb.so.1.20
ln -fs libleveldb.so.1.20 out-shared/libleveldb.so
ln -fs libleveldb.so.1.20 out-shared/libleveldb.so.1

後記

這裏總結了一下makefile的東西,其實裏面很多語法我根本不確定,可是大概思路就是這樣,以後有需要,要好好看下這方面的,以後總結幾篇關於c、cpp語法的博客,希望我可以看完這隔源代碼,覺得代碼量也不是很多。加油

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章