GCC允许隐式int到指针转换?

Posted

技术标签:

【中文标题】GCC允许隐式int到指针转换?【英文标题】:GCC allowing implicit int to pointer conversion? 【发布时间】:2014-05-05 22:46:43 【问题描述】:

所以我错误地将 int 传递给函数参数,期望指向 const 对象的指针,我从 GCC 收到了这个警告:

jni/../../../Source/Controller/UserExperienceManager.cpp: In member function 'void CUserExperienceManager::SendUXPToPOS(Types::CString)':
jni/../../../Source/Controller/UserExperienceManager.cpp:243:78: warning: invalid conversion from 'int' to 'const WebService_POSAgent::CDataCheck*' [-fpermissive]
jni/../../../../../Core/WebServices/Services/POSAgent/POSAgent.h:80:18: warning:   initializing argument 2 of 'CEvent& WebService_POSAgent::CPOSAgent::AddUserExperienceID(Types::CString, const WebService_POSAgent::CDataCheck*, Types::CString)' [-fpermissive]

我试图为此创建一个可重现的示例,但我无法做到,也无法在此处分享太多代码。我在 MSVC9 上编译了同样的东西,它正确地给了我一个错误。我只是感到震惊,我没有从 GCC 得到错误!有谁知道为什么?下面是一些简单的sn-ps:

函数声明(类成员函数):

CEvent& AddUserExperienceID(CString userExperienceId, CDataCheck const* check, CString requestId = REQUEST_ID);

函数调用站点:

int nCheckNum = /*some value*/;
CPOSAgent::Instance().AddUserExperienceID(m_UserExperienceId, nCheckNum);

【问题讨论】:

gcc 警告你你做错了什么,-fpermissive 是启用-禁用此警告的选项的名称。使用-Wall -Werror,你会很安全 如果您需要直接在代码中对警告/错误设置进行“微调”,您也可以查看this page。 是什么让你首先使用-fpermissive?了解您正在使用的工具。不要只是从别人的 makefile 中剪切和粘贴。那是货物崇拜编程。它会给你带来麻烦。 【参考方案1】:

您正在编译带有 -fpermissive 集的代码,这会将错误降级为警告。

 -fpermissive
  Downgrade some diagnostics about nonconformant code from errors to warnings.
  Thus, using -fpermissive will allow some nonconforming code to compile.

What does the fpermissive flag do?

【讨论】:

很有可能 - 警告消息实际上告诉我们他使用了 -fpermissive 标志。 :-)

以上是关于GCC允许隐式int到指针转换?的主要内容,如果未能解决你的问题,请参考以下文章

为啥首先允许指针从非常量到常量的隐式转换?

ARC 不允许将 Objective-C 指针隐式转换为“void *”

ARC 不允许将非 Objective-C 指针类型“const char *”隐式转换为“id”

在构造 std::variant 时禁用从指针类型到 bool 的隐式转换的最佳方法是啥?

Golang关于Go中的类型转换

为啥允许从 int 到 byte 但不允许从 long 到 int 的隐式缩小转换?