ETH官方钱包

前往
大廳
主題

C在編譯時帶入的變數,換行符和編譯參數補充

Yang | 2023-04-30 07:57:15 | 巴幣 0 | 人氣 253

接續之前寫的
Constexpr and Template Metaprogramming (樣板元編程) in C++11
C在編譯時帶入的變數
同一份C語言專案在不同平臺編譯


同一份程式碼專案,在不同平臺編譯,讀寫檔時,可能要注意換行符號的差別

Linux/Unix: "\n" (LF)
Windows: "\r\n" (CRLF)
Mac: "\n" (LF) (聽說以前是"\r"(CR),後來新版改為"\n"(LF),目前手邊沒機器測試)

程式碼內加上
#if NEW_LINE
static constexpr const char *NewLine = NEW_LINE < 2 ? "\n" : NEW_LINE == 2 ? "\r\n" : "\r";
#else
static constexpr const char *NewLine = "\n"; //不帶編譯參數時,預設換行符
#endif

在Linux/Unix編譯
g++ -std=c++11 -pthread -D NEW_LINE=1 -Wall -ggdb -O2 -MMD -MP ${file} -o ${fileDirname}/${fileBasenameNoExtension}
不帶參數時,預設是1,指令可以簡化為
g++ -std=c++11 -pthread -D NEW_LINE -Wall -ggdb -O2 -MMD -MP ${file} -o ${fileDirname}/${fileBasenameNoExtension}

在Windows編譯
g++ -std=c++11 -pthread -D NEW_LINE=2 -Wall -ggdb -O2 -MMD -MP ${file} -o ${fileDirname}/${fileBasenameNoExtension}

在舊版Mac編譯
g++ -std=c++11 -pthread -D NEW_LINE=3 -Wall -ggdb -O2 -MMD -MP ${file} -o ${fileDirname}/${fileBasenameNoExtension}


程式碼內如果有定義多個defines,譬如
#if LOG_BUF_SIZE
static constexpr unsigned int LogBufSize = LOG_BUF_SIZE < 2 ? 512 : LOG_BUF_SIZE == 2 ? 1024 : 2048;
#else
static constexpr unsigned int LogBufSize = 1024;
#endif

編譯時可以帶入多個-D
g++ -std=c++11 -pthread -D NEW_LINE -D LOG_BUF_SIZE=2 -Wall -ggdb -O2 -MMD -MP ${file} -o ${fileDirname}/${fileBasenameNoExtension}


C#可以通過Environment.NewLine,在不同的OS上取得設定的換行符

Environment.NewLine不是const,是一個執行期(run time)取得的變數,

上面的constexpr const char *NewLine,則是自行在程式碼內定義的編譯期(compile time)常數


經過測試,Linux/Unix平臺的"\n"(LF),在Windows平臺上開啟和顯示上都未出過問題

Visual Studio也能調整換行符

因此最近寫程式,都把NewLine簡單固定為
constexpr char NewLine = '\n'; //一個char即可,非字串

用C寫的程式換行符不再考慮不同平臺

(Windows平臺的"\r\n"(CRLF),在Linux/Unix上開啟,顯示上有可能看起來像是換行兩次,原因不明)

雖然這樣會變成在Windows上用C#寫的程式,讀取C產出或來自於Linux/Unix的檔案時,要注意換行符
送禮物贊助創作者 !
0
留言

創作回應

更多創作