小编You*_*hwi的帖子

为什么当枚举或int值作为函数的bool传递时,gcc不会发出警告?

我有以下代码:

typedef enum
{
    FOO,
    BAR,
    BAZ
} foo_t;

static void afunc(bool is_it_on)
{
    /* do the job */
}

int main(void)
{
    afunc(BAZ);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

即使-Wall -Wextra为编译器提供了选项,编译此代码也不会生成任何警告消息.我甚至试图与-Wconversion选项,它没有采取任何影响,因为boolenum似乎是G ++相同的尺寸.(enum据我所知,类型的大小没有在规格中定义)

我已经梳理了gcc手册并且没有发现它.

问题:

  • 有没有办法强制编译器在这种情况下生成警告?
  • 或者这个隐式转换是否符合c ++规范?

我正在使用的编译器:gcc 4.1.2


Editted

结论:

对此唯一可行的解​​决方案似乎是定义一个表示0或1的新类型,并使用它代替bool.

代码如下,g ++抱怨类型转换:

typedef enum
{
    FOO1,
    FOO2
} foo_t;

typedef enum
{
    MY_FALSE,
    MY_TRUE
} my_bool_t;

void foo(my_bool_t a)
{
}

int main(void)
{
     /* 
      * gcc generates …
Run Code Online (Sandbox Code Playgroud)

c++ gcc g++ gcc-warning

10
推荐指数
1
解决办法
1734
查看次数

从const char*转换为const std :: string&

我认为以下代码应该生成错误:

#include <iostream>
#include <string>

static void pr(const std::string &aStr)
{
    std::cout << aStr << "\n";
}

int main(void)
{
    const char *a = "Hellu";

    pr(a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是gcc 4.1.2成功地编译了它.

是std :: string的构造函数阻塞了,创建了std :: string的实例吗?

我认为它不应该,因为引用只是变量的别名(在这种情况下,没有引用引用的std :: string类型的变量).

是否有人解释为什么代码编译成功?

提前致谢.

c++

5
推荐指数
2
解决办法
3883
查看次数

标签 统计

c++ ×2

g++ ×1

gcc ×1

gcc-warning ×1