C++ではどうも"文字列"が自動的にstringになるようだ。
Cのmain関数をc_main名前に変えて、C++から呼びだそうとしたとき警告が出た。
//main.cpp
#include "c_main.h"
int main(){
char* argv[] = {"文字列"};
int argc = 1;
c_main(argc,argv);
return 0;
}
をコンパイルして実行すると#include "c_main.h"
int main(){
char* argv[] = {"文字列"};
int argc = 1;
c_main(argc,argv);
return 0;
}
$ g++ main.cpp
$ ./a.out
warning: deprecated conversion from string constant to ‘char*'
という警告が出る。$ ./a.out
warning: deprecated conversion from string constant to ‘char*'
「string constant型からchar*型への変換は非推奨です」ということである。
警告なのでこのままでもいいのだが、気持ち悪いのでいじってみた。
char* argv[] = {(char*)"文字列"};
型変換なので、これだけでOK。全体では以下のようにすればよい。
//main.cpp
#include "c_main.h"
int main(){
char* argv[] = {(char*)"文字列"};
int argc = sizeof argv/sizeof argv[0];
c_main(argc,argv);
return 0;
}
#include "c_main.h"
int main(){
char* argv[] = {(char*)"文字列"};
int argc = sizeof argv/sizeof argv[0];
c_main(argc,argv);
return 0;
}
//c_main.h
int c_main(void);
int c_main(void);
//c_main.c
#include "c_main.h"
int c_main(int argc, char *argv[]){
---- 関数の中身 ----
}
#include "c_main.h"
int c_main(int argc, char *argv[]){
---- 関数の中身 ----
}
余談だが、
int main(int argc, char *argv[])
のargvには実行時のオプションに与える文字列の配列、argcにはその個数が入っている。例えば、
//main.c
#include <stdio.h>
int main(int argc, char* argv[]){
printf("argc = %d\n",argc);
printf("1 = %s, 2 = %s, 3 = %s\n",argv[0],argv[1],argv[2]);
return 0;
}
をコンパイルして実行すると#include <stdio.h>
int main(int argc, char* argv[]){
printf("argc = %d\n",argc);
printf("1 = %s, 2 = %s, 3 = %s\n",argv[0],argv[1],argv[2]);
return 0;
}
$ gcc main.c
$ ./a.out 文字列1 文字列2 文字列3
argc = 4
1 = ./a.out, 2 = 文字列1, 3 = 文字列2
となる。
$ ./a.out 文字列1 文字列2 文字列3
argc = 4
1 = ./a.out, 2 = 文字列1, 3 = 文字列2
> C++ではどうも"文字列"が自動的にstringになるようだ。
返信削除えーと、そうではなくて・・・
string constant は std::string のことではなくて、cstring の const 型のことですよ。
argv の型を char * ではなく const char * としてください。