C / C ++使用malloc隐式void * cast

时间:2016-02-15 13:14:34

标签: c++ c language-lawyer

关于以下代码片段的问题

  char *p = malloc(10);

当我使用 gcc 编译任何-std=时,这确实可以很好地编译。

但是 g ++ 与任何-std=相比,这会产生错误:

w.c:4:21: error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]
  char *p = malloc(10);

为什么行为不同?我认为用C编译的所有行都应该用C ++编译器编译。对此有什么标准要求吗?

4 个答案:

答案 0 :(得分:5)

因为您使用gcc编译为C++,使用g++编译为C++。 那些是不同的语言。

对于来自void*的隐式转化,

Feb 15 16:09:08 ubuntu sshd[1907]: fatal: ssh_dispatch_run_fatal: Connection to 192.168.###.##: no matching key exchange method found [preauth] 的输入更为强烈。

答案 1 :(得分:4)

首先,它明确规定了这两种语言,编译器就足够了。

但是有很好的理由为什么C允许从指针到任意的隐式转换为void *并返回,而C ++不允许它。由于C没有继承支持,所有类型的多态都需要使用void *指针。因此,void *之间的转换被认为是一种常见的用例。另外,由于C中没有静态,动态或const转换,如果要保持指针的常量,则必须在每次void *转换时重复它。

但是C ++确实有继承,静态和动态转换。因此,从指针转换到任何void *并返回的转换具有较少的常见用例,因此必须是明确的。最后但并非最不重要的是,new的使用隐藏了对malloc的调用,并直接给出了一个指向正确类型的指针,避免了每次创建动态对象时的强制转换形式void *

答案 2 :(得分:2)

C ++不会对char *p = static_cast<char*>(malloc(10)); 进行隐式转换......您必须明确地执行此操作

char *p = reinterpret_cast<char*>(malloc(10));

mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
// second argument is the default to use if the preference can't be found
Boolean welcomeScreenShown = mPrefs.getBoolean(welcomeScreenShownPref, false);
int savedVersion = mPrefs.getInt("savedVersiono", 0);
PackageInfo pinfo;
int currentVersion = 0;
try{
    pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    currentVersion = pinfo.versionCode;
}catch (NameNotFoundException ex){

}

if (!welcomeScreenShown || (currentVersion > savedVersion)) {
   //Popup Show

    String whatsNewTitle = getResources().getString(R.string.whatsNewTitle);
    //Changelog Text
    String whatsNewText = getResources().getString(R.string.whatsNewText);
    new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle(whatsNewTitle).setMessage(whatsNewText).setPositiveButton(
                R.string.ok, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                }).show();
    SharedPreferences.Editor editor = mPrefs.edit();
    editor.putBoolean(welcomeScreenShownPref, true);
    editor.putInt("savedVersiono", currentVersion);
    editor.apply(); //Needs to be set!
}

答案 3 :(得分:0)

虽然很多人认为用C语言完成的所有事情都可以用C ++完成,但几乎相同的代码是错误的。 C ++不是C的超集。两者都不同。

因此,编译器将不同,g++用于C ++,而gcc用于C。

请检查:What is the difference between g++ and gcc?