error: invalid conversion from ‘void*’ to ‘char *’
警告:C言語なのにC++コンパイラを誤って使ってる?
■この記事の概要
C言語で開発しているつもりが、C++コンパイラが原因で予期しないエラーが発生することがあります。
この記事では、C言語とC++の違いや、C++コンパイラの影響を見分ける方法について初心者向けに解説します。
■終端文字¥0の無い初期化
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main(void){
char str[3] = "123";//エラーが出たらC++
putchar(str[0]);
putchar(str[1]);
putchar(str[2]);
}
C言語では4行目でエラーにならず、
終端文字¥0のない初期化が可能です。
●g++(C++)では次のコンパイルエラーになります。
error: initializer-string for array of chars is too long [-fpermissive]
■void *型の扱い
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
//エラーが出たらC++
char *dst = malloc(sizeof("123"));
if(dst == NULL){
perror(NULL);
exit(1);
}
strcpy(dst,"123");
puts(dst);
free(dst);
}
C言語では7行目でエラーにならず、
void *型のmallocにキャストは不要です。
●g++(C++)では次のコンパイルエラーになります。
error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]
Visual Studio使用者でC言語のつもりで
C++コンパイラを起動している場合が
けっこうあります。
ご利用のコンパイラで上記のプログラムが
コンパイルできれば
Cコンパイラをご利用です。
コンパイルエラーになれば
C++コンパイラを起動しています。
多くの場合
Visual Studioでプロジェクトを作る際に
main.c でなくて
main.cpp で登録してしまっているようです。
接尾子が.cppの場合自動的にC++のプログラムと判断され、
C++コンパイラが起動されます。
■sizeof(‘A’)の結果
#include <stdio.h>
int main(void) {
if(sizeof('A') == sizeof(char)){
puts("貴方はC++コンパイラを使っています");
return 1;
}
if(sizeof('A') == sizeof(int)){
puts("貴方はCコンパイラを使っています");
return 0;
}
puts("貴方は未知のコンパイラを使っています");
return -1;
}
●gcc(C言語)の実行結果 sizeof(int)と同じ
●g++(C++)の実行結果 sizeof(char)と同じ