为什么这个没有类型的函数仍然有效?

Why does this function without a type still work?

为什么即使我声明了一个没有类型的函数也没有收到错误消息?

如果默认接受 return 类型作为某些类型,这样编写代码是否健康?

如果它已经像这样使用编译器功能,那么我们为什么还要为函数编写 void

注意:我使用的 Code::Blocks 有一个遵循 c++11 std 的 gnu 编译器,如果它与它有任何关系的话。

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

ProfitDetermine (string str="")
{
    int profit=0, outcome=0, income=0, sales=0;
    int numberofhc=10, insur=1000000, hccost=2000000, price=3000000;
    stringstream (str) >> sales;

    outcome = (numberofhc * (insur + hccost));
    income = (sales*price);
    profit = income - outcome;
    cout << "profit is " << profit <<endl;

    if (profit < 0)
        cout << "lost\n";
    else if (profit==0)
        cout << "even\n";
    else
        cout << "profit\n";
}

int main()
{
    string sales="";
    cout << "enter the number of sales\n";
    getline(cin,sales);
    stringstream (sales) >> sales;

    while (sales!="quit") {
    ProfitDetermine(sales);
    cout << "\n\nEnter the number of sales\n";
    cin >> sales;
    }

}

Why does this function without a type still work?

该程序在标准 C++ 中的格式不正确。

在某些旧版本的 C 中,类型声明是可选的,类型默认为 int。 C 编译器将此 "feature" 保留为语言扩展。那些C编译器已经变成了C++编译器,并且仍然保留了语言扩展。

除了格式错误之外,您的程序还有未定义的行为,因为 隐式 的函数 - 通过语言扩展 - 声明为 return int 无法 return 任何值。


is it healthy to write codes like this?

没有

I am using ... gnu compiler

您可以使用 -pedantic 选项要求 GCC 符合标准。当程序格式错误时,您可以使用 -pedantic-errors 选项要求 GCC 编译失败 - 尽管 -fpermissive 选项可能会覆盖它,因此请注意不要使用它。

在 C++ 中,根据 ISO C++ 声明一个没有类型的函数是错误的,但您可以使用“-fpermissive”标志忽略此错误。您的编译器可能会使用此标志来忽略标准编码错误,将它们降级为警告。在声明函数时,您应该始终至少使用 void 类型,以便您的代码符合标准,并且可以被每个程序员和编译器理解。