乙個編譯器的小陷阱

2021-08-22 17:25:55 字數 506 閱讀 8659

有時候在乙個平台執行正確的程式,在另乙個平台就會出問題。在平台移植中,最常見的問題可能就是位元組序和對齊這類問題了。本文記錄的是我以前碰到過的乙個小陷阱。看看這段**的輸出應該是什麼?

#include "stdio.h"

char do_something(int *p)

void test1(void)

int main(void)

如果我們使用vc編譯器或arm編譯器,它的輸出是abcdex。如果我們使用gcc,它的輸出是xbcdef。關鍵在於這句:

s[index] = do_something(&index);
等號左側的index在等號右側被改變了。vc和arm編譯器使用改變後的index(值為5),gcc編譯器使用改變前的index(值為0)。我實際碰到的**當然要複雜的多,在上萬行**中找到這行**可不是一件讓人愉快的事情。其實,解決此類編譯器陷阱的最好方法就是:不要寫可能產生歧義的語句。從本例我們應該記住:

你碰到過類似的陷阱嗎?

while的乙個小陷阱

先看一段 示例 pragma warning disable 4996 include copy.h char mystrcpy char desc,const char src 為了讓 看起來更加的簡潔美觀,我一直喜歡這樣寫while,而且也沒出過什麼問題。但是這樣寫是否存在問題,看一下下面這個示...

以前自己做的乙個小編譯器的語法設計

語法和語義的實現過程 1 程式 main 2 宣告 int s empty 3 s v,s 4 s v 5 v id 6 v id digit 7 語句集 具體語句 語句集 empty 8 語句集 具體語句 empty 9 具體語句 賦值語句 選擇語句 迴圈語句 讀值語句 列印語句 10 賦值語句 ...

乙個PHP語言的小陷阱

直接上 吧 class a class b extends a obj new b obj showname 大家猜猜看,程式輸出的是a還是b?如果你堅定地回答 a 那麼下面的內容就不用看了 如果你回答的是b,或者不確定,則有必要繼續看下去。首先給出正確答案 a。原因分析 在b的建構函式中,由於 n...