如何使用#define语句

时间:2017-03-06 08:19:55

标签: c casting

我经常使用#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;
}

我的问题是,铸造类型是否必要?

2 个答案:

答案 0 :(得分:2)

按照要求回答您的问题....粗略地说,我建议您在代码中对抗所有宏。我会尽可能避免使用类型显式转换(也就是类型转换) - 无论是否在宏中。

更详细地回答......

诀窍是理解在使用宏的情况下预处理阶段输出的代码。如果该代码需要类型转换,那么宏可以提供它。

例如,忽略标准头文件的内容,给定第一个代码示例的预处理器输出将类似于

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

     return 0;
}

因此,要回答您的问题,您需要确定在此上下文中是否应将文字100转换为uint8_t。对于可能使用宏的所有合理方式,请仔细考虑。

在这种情况下,可能不需要类型转换。最多,它可能会抑制编译器警告 - 这在某些项目中是有效的考虑因素,而在其他项目中则不然。它不会改变程序用户所观察到的代码行为。

请记住,通常最好避免使用真实代码中的类型转换,因为它们会导致编译器接受原本会被拒绝的代码(即导致编译失败)。在这种情况下,通过宏引入类型转换将非常危险,除非您可以确认所有可能的用例都是有效的。

正如其他人在评论中所说的那样,找到除宏以外的一些技术可能是一种更好的做法(这使得你在宏观中使用类型转换的问题有点学术性)。是的,宏有它们的用途 - 但在很多情况下,C和C ++都有更好的选择。包括你的。

答案 1 :(得分:0)

如果定义的常量的类型很重要,那么你应该使用强制转换。这是必须根据具体情况考虑的事情。

在您发布的示例中,演员阵容毫无意义。如果==运算符的任一个或两个操作数都是所谓的“小整数类型”(在这种情况下它们),则它们隐式地类型转换为类型int。因此,您的代码100%等同于

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

并且(uint8_t)100演员阵容完全毫无意义。