命令行参数的第二个参数,其格式不是char ** argv或char * argv [] [关闭]

问题描述 投票:-6回答:2

为了解决我的问题here,我想知道是否/如何以char** argvchar* argv[]以外的格式定义命令行参数的第二个变量。 The reason是pybind11不允许函数输入中的任何一个。这是我尝试过的方法:

方法1:

#include <stdio.h>

int main(int argc, int* argv_){
    for (int i = 0; i < argc; ++i){
        printf("%s\n", (char *)(argv_[i]));
    }
}

此方法的原理是,指针本质上是一个整数,并且通过将地址强制转换为char指针,就应该能够获取字符串。感谢您的提前支持。

方法2:

#include <stdio.h>
#include <string>

int main(int argc, std::string* argv_){
    for (int i = 0; i < argc; ++i){
        printf("%s\n", argv_[i].c_str());
    }
}

方法3:

#include <stdio.h>
#include <string>
#include <vector>

int main(int argc, std::vector<std::string> argv_){
    for (int i = 0; i < argc; ++i){
        const char* argv__ = argv_[i].c_str();
        printf("%s\n", argv_[i].c_str());
    }
}

问题:

[不幸的是,以上所有方法都导致了臭名昭著的segmentation fault

如果您能帮助我知道问题出在哪里(即内存泄漏在哪里)以及如何解决它们,我将不胜感激。

解决方法/黑客:

在评论中,我被告知,如果使用除main()main(int argc, char** argv)main(int argc, char* argv[])以外的任何其他形式,它将不可避免地导致segmentation fault。但是,下面的代码有效:

#include <stdio.h>

int main(int argc, long* argv_){
    for (int i = 0; i < argc; ++i){
        printf("%s\n", (char *)(argv_[i]));
    }
}

这适用于Ubuntu minimal和g++ 7.4.0,以及Windows 10 Visual Studio 2019编译器。但是,它不能用clang进行编译。正如其他人指出的那样,这不是解决方案,也不是很糟糕的做法。它可能导致不确定的行为,具体取决于编译器,操作系统和内存的当前状态。任何C / C ++代码中的主要功能都必须为main()main(int argc, char** argv)main(int argc, char* argv[])形式。

为了在这里解决我的问题,我想知道是否/如何以char ** argv或char * argv []以外的格式定义命令行参数的第二个变量。原因是pybind11不会...

c++ segmentation-fault command-line-arguments argv
2个回答
5
投票

看起来好像根本不需要是main,所以您可以这样:


2
投票

让我们尝试解决在漫长的讨论中出现的过多问题。首先,让我们看看您的问题是什么。


0
投票
如C ++标准第6.8.3.1.2节[basic.start.main]中所述,唯一的保证是关于main函数的,是您可以将main定义为不带参数,或带参数(int, char**)。任何其他可能的变体都由实现定义,并且您应该查看编译器的文档,以查看它们是否支持任何其他变体:
© www.soinside.com 2019 - 2024. All rights reserved.