這個C 指標不為空,為什麼 if將其判斷為nullptr?

時間 2021-06-01 06:21:40

1樓:Mimosa

用於巨集 #if 的判斷表示式中不能含變數。你的#if的判斷表示式中的p,因為是沒有定義過(#define),所以編譯器把它看成空( nullptr)的識別符號。

2樓:d41d8c

因為p沒有定義成巨集。

預處理器甚至會認為

#if (p + 1) == 1

中的表示式為真。

GCC和Clang的-Wundef、MSVC的-w14668編譯引數會對這種用法產生警告,產生的警告資訊裡面有解釋。

3樓:John Suen

The expression is a constant expression.

The expression may contain unary operators in form defined identifier or defined (identifier).

Conditional inclusion

The expression following #if or #elif must expand to

operators other than assignment, increment, decrement, function-call, or comma whose arguments are preprocessor constant expressions

integer constants

character constants

the special preprocessor operator defined

Character constants, when evaluated in #if-expressions, may be interpreted in the source character set, the execution character set, or some other implementation-defined character set.

Constant expressions

4樓:程式設計師bingo

結論:#if的p和前面的int* p沒有關係,可以認為是2個不同的p。

#if是條件編譯指令,在編譯期間就會去判斷這個p是不是為nullptr,而這個p的要定義,可以通過#define來賦值。

而int* p,那是執行時的變數,等到它有非空值,那已經是在編譯之後了。

C語言有指標字串,為什麼沒有指標數字?

虛實道長 我個人覺得這個跟計算機的架構,以及數字或者字元的編碼有關。計算機如果暫存器是32位的,當然可以直接支援32位的數字 整數或者浮點數 但是字元,本質上也是 數字的形式 儲存,那麼顯然的問題就是 如何把abcd26個英文本元和常用字元用什麼數字儲存?單個字元可以轉化為32位數字,而字串不能夠。...

為什麼 C 有指標了還要引用?

airtrack 這個在 C 語言的設計與演化 上面有詳細說明,原因就是為了支援操作符過載。對於很多C 語法為什麼這麼設計都可以在這本書上找到答案。 Berry Geek 因為引用是編譯器層的東西,編譯完後並不會占用真正的記憶體.而指標是個資料,是要單獨占用記憶體儲存的.更新一下 說 引用編譯玩後不...

linux驅動空指標引用為什麼會導致核心panic

花滿樓 無論是32位還是64位,虛擬位址的布局中核心空間都是高位,使用者空間都是低位,所以0這個虛擬位址不是合法的核心虛擬位址 希望有幫助 沈凋墨 核心是所有程序共享的,如果核心發生段錯誤,其他程序不大可能還能夠繼續正常執行,此時不panic更待何時?這個詞選得很妙,所有程序人心惶惶,沒法工作。 m...