This问题指出main可以用some restrictions定义实现。因此,我编写了以下C++
代码,以尝试以下main
的签名:
main.h
class MyClass {
private:
int i;
public:
MyClass();
inline int geti() {
return i;
}
inline void seti(int i) {
this->i = i;
}
~MyClass();
};
MyClass::MyClass() {
this->i = 2;
}
MyClass::~MyClass() {
}
main.c ++
#include <iostream>
#include "main.h"
int main(MyClass myClass) {
std::cout << myClass.geti() << std::endl;
return 0;
}
哪个给出以下结果:
命令g++ -o main main.c++ -O3
成功编译并显示警告:
main.c++:5:5: warning: first argument of ‘int main(MyClass)’ should be ‘int’ [-Wmain]
5 | int main(MyClass myClass) {
| ^~~~
main.c++:5:5: warning: ‘int main(MyClass)’ takes only zero or two arguments [-Wmain]
命令clang++ -o main main.c++ -std=c++14
给出错误:
main.c++:5:5: error: first parameter of 'main' (argument count) must be of type 'int'
int main(MyClass myClass) {
^
1 error generated.
main
生成的g++
文件给出SIGSEGV
(为什么?)
因此,如果可以定义main的实现,为什么clang
产生错误而g++
生成的文件给出SIGSEGV
?
我也走得更远,创建了一个不同的代码,因此我可以将MyClass
对象传递给main.c++
,如下所示:
#include <iostream>
#include "main.h"
#include <unistd.h>
int main() {
MyClass myClass;
execve("./main",myClass,NULL);
return 0;
}
但是,由于execve
将第二个参数设为char* const *
,因此不会编译。如何将myClass对象传递给main
生成的g++
文件?
您很近。您已经确定了尝试将其作为参数传递给main()
的主要问题-无法解决。 main()
的声明是由标准定义的,并且您只能将字符串值(以null终止的字符数组... C-Strings)作为参数传递。
例如,您需要在main()
中为您的课程创建一个实例,>
#include <iostream> #include "main.h" int main() { MyClass myClass; std::cout << myClass.geti() << std::endl; return 0; }
您的
main.h
标头在第10行有一个可变的阴影问题:
inline void seti(int i) {
int i
遮盖了第3行的先前声明,例如int i;
(尽管后果不太可能发生)。只需将第二个声明中的变量名称替换为j
(或您喜欢的任何名称)。您的代码将在没有警告的情况下进行编译,例如
class MyClass { private: int i; public: MyClass(); inline int geti() { return i; } inline void seti(int j) { this->i = j; } ~MyClass(); }; MyClass::MyClass() { this->i = 2; } MyClass::~MyClass() { }
示例使用/输出
$ ./bin/main 2
让我知道是否还有其他问题。