我经常使用#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;
}
我的问题是,铸造类型是否必要?
答案 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
演员阵容完全毫无意义。