关于以下代码片段的问题
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 ++编译器编译。对此有什么标准要求吗?
答案 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。