amazon

25.3.11

C++ string型からchar**型へ


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;
}
をコンパイルして実行すると
$ g++ main.cpp
$ ./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;
}


//c_main.h
int c_main(void);


//c_main.c
#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;
}
をコンパイルして実行すると

$ gcc main.c
$ ./a.out 文字列1 文字列2 文字列3
argc = 4
1 = ./a.out, 2 = 文字列1, 3 = 文字列2
となる。

1 件のコメント:

  1. > C++ではどうも"文字列"が自動的にstringになるようだ。
    えーと、そうではなくて・・・
    string constant は std::string のことではなくて、cstring の const 型のことですよ。
    argv の型を char * ではなく const char * としてください。

    返信削除