在哪里需要 class 作为 main 参数的语法?
Where is the syntax with class as a parameter in main needed?
question states that main can be implementation defined with 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.
g++
生成的 main
文件给出了 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 对象传递给 g++
生成的 main
文件?
你很接近。您已确定尝试将其作为参数传递给 main()
的主要问题——这是行不通的。 main()
的声明由标准定义,您只能将字符串值(nul-terminated 字符数组... C-Strings)作为参数传递。
在您的情况下,您需要在 main()
内创建 class 的 实例 ,例如
#include <iostream>
#include "main.h"
int main() {
MyClass myClass;
std::cout << myClass.geti() << std::endl;
return 0;
}
您的 main.h
header 有一个变量阴影问题,第 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() {
}
例子Use/Output
$ ./bin/main
2
您还可以调用 seti()
函数来更新 class 中的私有变量,例如
myClass.seti(5);
std::cout << myClass.geti() << std::endl;
现在将输出 5
。
如果您还有其他问题,请告诉我。
The command g++ -o main main.c++ -O3
compiles successfully with warnings
编译失败。您应该始终使用 -Werror
。如果您没有这样做,然后决定忽略警告并继续 运行 该程序,则由您自己负责。你最好清楚地知道你在做什么。有关详细信息,请参阅 。
the main file generated by g++ gives SIGSEGV (why though?)
编译器已警告您。聆听它符合您的最大利益。如果事情进展顺利,很可能是因为您忽略了警告。
why does clang give an error while g++ generated file give SIGSEGV?
该程序不是有效的 C++ 程序。警告和错误之间没有有意义的区别。
How do I pass the myClass object to the main file generated by g++?
你不能。 main
的形式必须等同于以下两者之一:
int main()
int main(int argc, char* argv[])
(可选斜体阅读)main
的其他形式是实现定义的。这意味着您的实施需要以记录的方式支持它们。除非你已经阅读了你的实现文档并发现它支持你想要的 main
形式,否则没有办法做到这一点。
除了具有实现定义的 main
, 程序获取 class 类型对象的唯一方法是构造那个对象。
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.
g++
生成的 main
文件给出了 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 对象传递给 g++
生成的 main
文件?
你很接近。您已确定尝试将其作为参数传递给 main()
的主要问题——这是行不通的。 main()
的声明由标准定义,您只能将字符串值(nul-terminated 字符数组... C-Strings)作为参数传递。
在您的情况下,您需要在 main()
内创建 class 的 实例 ,例如
#include <iostream>
#include "main.h"
int main() {
MyClass myClass;
std::cout << myClass.geti() << std::endl;
return 0;
}
您的 main.h
header 有一个变量阴影问题,第 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() {
}
例子Use/Output
$ ./bin/main
2
您还可以调用 seti()
函数来更新 class 中的私有变量,例如
myClass.seti(5);
std::cout << myClass.geti() << std::endl;
现在将输出 5
。
如果您还有其他问题,请告诉我。
The command
g++ -o main main.c++ -O3
compiles successfully with warnings
编译失败。您应该始终使用 -Werror
。如果您没有这样做,然后决定忽略警告并继续 运行 该程序,则由您自己负责。你最好清楚地知道你在做什么。有关详细信息,请参阅
the main file generated by g++ gives SIGSEGV (why though?)
编译器已警告您。聆听它符合您的最大利益。如果事情进展顺利,很可能是因为您忽略了警告。
why does clang give an error while g++ generated file give SIGSEGV?
该程序不是有效的 C++ 程序。警告和错误之间没有有意义的区别。
How do I pass the myClass object to the main file generated by g++?
你不能。 main
的形式必须等同于以下两者之一:
int main()
int main(int argc, char* argv[])
(可选斜体阅读)main
的其他形式是实现定义的。这意味着您的实施需要以记录的方式支持它们。除非你已经阅读了你的实现文档并发现它支持你想要的 main
形式,否则没有办法做到这一点。
除了具有实现定义的 main
, 程序获取 class 类型对象的唯一方法是构造那个对象。