gcc警告不同的返回类型

时间:2015-06-17 20:31:52

标签: c gcc

我用C编写了一个库,现在将用于嵌入式处理器板。我需要减少内存占用量,因此将某些函数的返回类型从int更改为char(仅用于标记错误)。

更改返回类型但不更改返回的变量不会产生警告。有没有办法在gcc中设置这个,因为我想确保我已经捕获了所有实例。

char processSomething (SomeType *something)
{
  int result = 0;
  ...
  do stuff
  ...

  return result; /* no warning */
}

由于

6月19日: 我添加了-Wconversion,它突出了一些有趣的东西。这有两个问题。我的一个函数我使用两个字符的十六进制字符串并使用

转换为十进制

char decimal;

decimal = hexstring [0] - '0' << 4 + hexstring [1] - '0'; // for 0 to 9

它抱怨从int转换为char,我可以收集的是&#39; - &#39;,&#39; +&#39;和&#39;&lt;&lt;&# 39;运算符似乎都隐式转换为int。这是正确的还是我解释错误的警告。或者有更好的方法来做到这一点吗?

此外,当将strtol用于int时(抱怨&long;&#39; to&#39; int&#39;)但是我可以保证即使是短int也不会超过该值,是对于类型转换是否安全?因为它将截断长的额外(并希望零字节)?或者这取决于字节顺序?

由于

2 个答案:

答案 0 :(得分:7)

在这个特定情况下,-Wconversion应该在我的简单测试用例( see it live )中为您提供所需的警告:

char func()
{
    int x = 10 ;

    return x ;
}

int main() {}

我收到以下警告:

  

警告:从'int'转换为'char'可能会改变其值[-Wconversion]

答案 1 :(得分:2)

这是一个非常糟糕的主意:char在大多数嵌入式系统上都是一定的大小(通常为1个字节,因此它实际上是unsigned char),如果你最终以某种方式设置int result = 256 ,它会溢出并返回0.你的错误刚刚变成了成功。 Crashy crashy(希望如此)。更糟糕的是,可能会使用您的嵌入式设备杀死某人。

我知道你正试图解决这个问题,但即使只是返回魔法数字也很危险。

相反,声明一个错误的枚举类型。它将为您提供类型安全(在一定程度上)并自动为您的函数创建正确的返回大小。

typedef enum status {
    STATUS_OK = 0,
    STATUS_ERR1,
    STATUS_ERR2,
// ... etc ...
} status_t;

status_t processSomething (SomeType *something)
{
  status_t result = STATUS_OK;
  ...
  do stuff
  ...

  return result;
}

这样更安全,编译器只会为你的返回分配1个字节,直到你有太多不适合的方式,只有这样才能使它更大。 取自目前的C标准(C99):http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

  

6.7.2.2枚举说明符       [...]       约束       定义枚举常量值的表达式应为具有可表示值的整数常量表达式   作为一个int。       [...]       每个枚举类型应与char,有符号整数类型或无符号整数类型兼容。类型的选择是   实现定义,但应能够代表   枚举的所有成员的值。