2017-03-06 47 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++都有更好的选择。包括你的。