在哪里需要 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 类型对象的唯一方法是构造那个对象。