首页 > 解决方案 > 传递枚举而不是指针时如何触发整数转换警告

问题描述

给定以下代码

#include <stdio.h>

typedef enum{
    ISP_INPUT_NONE,
    ISP_INPUT_DOLBY
} UserStream_t;

int someFunc(const char * str) {
    printf("%s", str);
    return 0;
}

int main(int argc, char** arg)
{
    int a = ISP_INPUT_NONE;
    someFunc(ISP_INPUT_NONE);
    someFunc(a);
    return 0;
}

第二次调用会触发整数转换警告,但第一次不会。

gcc -Wall test.c
test.c: In function ‘main’:
test.c:17:14: warning: passing argument 1 of ‘someFunc’ makes pointer from integer without a cast [-Wint-conversion]
   17 |     someFunc(a);
      |              ^
      |              |
      |              int
test.c:8:27: note: expected ‘const char *’ but argument is of type ‘int’
    8 | int someFunc(const char * str) {
      |              ~~~~~~~~~~~~~^~~

枚举是否默默地转换为指针?

我认为 C 枚举被认为是整数。我希望第一次调用生成与第二次相同的警告。

标签: ccompiler-warnings

解决方案


枚举是否默默地转换为指针?

好吧,其中一些。ISP_INPUT_NONEis0和枚举值是常量表达式,而具有值的常量表达式0 空指针常量。将空指针常量转换为另一个指针是正常的。

enum如果值不是,仍会发出警告0,例如 for someFunc(ISP_INPUT_DOLBY);

传递枚举而不是指针时如何触发整数转换警告

想法:

从 1 而不是 0开始enum

typedef enum {
    ISP_INPUT_NONE = 1,
    ISP_INPUT_DOLBY
} UserStream_t;

使用结构并有转换错误。

typedef struct {
   unsigned char val;
} UserStream_t;
static const UserStream_t ISP_INPUT_NONE = {0};
static const UserStream_t ISP_INPUT_DOLBY = {1};

以某种方式使用宏,因此它ISP_INPUT_NONE不是常量表达式。

static int entity(int a) { return a; }

typedef enum{
    ISP_INPUT_NONE,
#define ISP_INPUT_NONE (entity(ISP_INPUT_NONE))
    ISP_INPUT_DOLBY
} UserStream_t;

使用带有选项的clang编译器。-Wnon-literal-null-conversion

在 g++ 中有-Wzero-as-null-pointer-constant选项,但在 gcc 中没有 C 选项。您也可以向 gcc 提出功能请求。


推荐阅读