sogou / srpc

RPC framework based on C++ Workflow. Supports SRPC, Baidu bRPC, Tencent tRPC, thrift protocols.
Apache License 2.0
1.94k stars 382 forks source link

Update src\generator\compiler.cc #333

Closed yourlife-mylife closed 1 year ago

yourlife-mylife commented 1 year ago

在windows中使用时,srpc_generator不能自动生成文件。是因parse_origin函数返回0时表示参数解析成功,要使程序能继续往下执行,需要将if语句中的“==”改成“!=”。

Barenboim commented 1 year ago

你修改的地方不是在#ifndef _WIN32里么?好像不影响windows啊。

yourlife-mylife commented 1 year ago

你修改的地方不是在#ifndef _WIN32里么?好像不影响windows啊。

ifndef _WIN32是指在非windows里面如果执行第一个if语句执行后接着执行if (parse_getopt(argc, (char const )argv, params, idl_type) != 0),所以Linux里面会校正过来,但是windows里面就直接return 0了

holmes1412 commented 1 year ago

感谢你的PR! 这里非Windows下的意思是:

#ifndef _WIN32
    if (parse_origin(argc, argv, params, idl_type) == 0) // 如果解析暂时没有出错
    {
        if (parse_getopt(argc, (char * const *)argv, params, idl_type) != 0) // 就继续尝试做类getopt格式的解析
            return 0;
    }
#else
    parse_origin(argc, argv, params, idl_type);  // 直接做最基本格式的解析                             
#endif                                                                             
    // 无论哪种平台,如果解析不出来out_dir(也就是输出目录)或者idl_file(也就是proto文件)
    if (params.out_dir == NULL || params.idl_file.empty())                         
    {                                                                              
        fprintf(stderr, SRPC_GENERATOR_USAGE, argv[0]);  // 就退出
        return 0; // 84行
    }

因为srpc_generator支持两类格式:

所以这个parse_origin()是用来解析简单格式的。

麻烦再帮确认下,windows的错误是在84行返回的么?

yourlife-mylife commented 1 year ago

你修改的地方不是在#ifndef _WIN32里么?好像不影响windows啊。

ifndef _WIN32是指在非windows里面如果执行第一个if语句执行后接着执行if (parse_getopt(argc, (char const )argv, params, idl_type) != 0),所以Linux里面会校正过来,但是windows里面就直接return 0了

感谢你的PR! 这里非Windows下的意思是:

#ifndef _WIN32
  if (parse_origin(argc, argv, params, idl_type) == 0) // 如果解析暂时没有出错
  {
      if (parse_getopt(argc, (char * const *)argv, params, idl_type) != 0) // 就继续尝试做类getopt格式的解析
          return 0;
  }
#else
    parse_origin(argc, argv, params, idl_type);  // 直接做最基本格式的解析                             
#endif                                                                             
    // 无论哪种平台,如果解析不出来out_dir(也就是输出目录)或者idl_file(也就是proto文件)
    if (params.out_dir == NULL || params.idl_file.empty())                         
    {                                                                              
        fprintf(stderr, SRPC_GENERATOR_USAGE, argv[0]);  // 就退出
        return 0; // 84行
    }

因为srpc_generator支持两类格式:

  • 简单格式:srpc_genertor protobuf demo.proto ./some_dir/
  • 类getopt格式(windows下不支持):srpc_genertor -i demo.proto -o ./some_dir/ 所以这个parse_origin()是用来解析简单格式的。

麻烦再帮确认下,windows的错误是在84行返回的么?

不好意思,是我的疏忽,其实是因为我本地的代码不是最新的,我刚刚看了最新代码,这个问题是已经处理过了的

holmes1412 commented 1 year ago

好的哈!windows下如果发现什么问题欢迎随时帮跟进!

yourlife-mylife commented 1 year ago

你修改的地方不是在#ifndef _WIN32里么?好像不影响windows啊。

ifndef _WIN32是指在非windows里面如果执行第一个if语句执行后接着执行if (parse_getopt(argc, (char const )argv, params, idl_type) != 0),所以Linux里面会校正过来,但是windows里面就直接return 0了

这是以前版本的问题,我刚看到最新代码已经解决了,不好意思