2017-03-06 111 views
-3

我經常使用#define語句。例如:如何使用#define語句

#include <stdio.h> 
#include <stdint.h> 

#define SAMPLENO 100 

int main() 
{ 
    uint8_t num_of_samples; 
    //some code 
    if(num_of_samples == SAMPLENO) 
    { 
     //some code 
    } 

    return 0; 
} 

最近我聽說#define語句應該和cast類型一起使用。例如:

#include <stdio.h> 
#include <stdint.h> 

#define SAMPLENO ((uint8_t)100) 

int main() 
{ 
    uint8_t num_of_samples; 
    //some code 
    if(num_of_samples == SAMPLENO) 
    { 
     //some code 
    } 

    return 0; 
} 

我的問題是以下,鑄造類型是否必要?

+4

選擇一種語言。沒有C/C++這樣的東西。你不會在C++中爲此使用宏。 – StoryTeller

+2

爲什麼你使用宏? –

+0

你在哪裏頭_「那,#define語句應該與鑄造類型一起使用。」_? –

回答

0

如果定義的常量的類型很重要,那麼你應該使用一個強制類型。這是必須根據具體情況來考慮的,具體取決於如何使用定義。

在您發佈的示例中,演員陣容毫無意義。如果==運算符中的一個或兩個運算符都是所謂的「小整數類型」,則它們在這種情況下是隱式類型轉換爲int類型。因此,你的代碼就相當於100%

if((int)num_of_samples == (int)SAMPLENO) 

(uint8_t)100塑像是完全沒有意義的。

2

回答你問的問題....粗略地說,我會推薦你​​的代碼中的所有宏。我會盡可能避免使用類型顯式轉換(又名類型轉換) - 無論是否在宏中。

爲了更詳細地回答.....

關鍵是要明白,是在環境預處理階段在使用宏輸出的代碼。如果該代碼需要進行類型轉換,那麼宏可能會提供它。

例如,忽略了標準的頭的內容,從預處理器輸出給你的第一個代碼示例將類似

int main() 
{ 
    uint8_t num_of_samples; 
    //some code 
    if(num_of_samples == 100) 
    { 
     //some code 
    } 

    return 0; 
} 

因此,要回答你的問題,你會需要的,如果字面來決定在這種情況下,100應該轉換爲uint8_t。對於可能使用宏的所有合理方式,請經過相同的考慮。

在這種情況下,類型轉換可能不是必需的。最多可以抑制編譯器警告 - 這在某些項目中是有效的考慮因素,但在其他項目中則不是這樣。它不會改變代碼的行爲,正如程序用戶所觀察到的那樣。

請記住,在實際代碼中避免類型轉換通常更可取,因爲它們可能會導致編譯器接受否則會被拒絕的代碼(即導致編譯失敗)。在這種情況下,通過宏引入類型轉換將非常危險,除非您可以確認所有可能的用例都是有效的。

正如其他人在評論中所說的,找到除宏之外的其他技術可能是一種更好的做法(這會讓你對在宏中使用類型轉換有點學術問題)提出疑問。是的,宏有其用途 - 但在許多情況下,C和C++都有更好的選擇。包括你的。