在linux中编译简单的C ++程序(第一次)

时间:2013-11-23 20:37:24

标签: c++ linux unix compilation

我在linux中使用c ++编译一个简单程序时遇到错误。共有3个文件:Employee.h , Employee.cpp, and Salary.cpp (main)。我在Salary.cpp中包含了几个系统头文件<iostream>, <fstream>, <string>, <stdio.h>, <stdlib.h>我使用的唯一原因是itoa()函数。我无法将其编译并阅读某些地方,有时候这是先决条件 我得到的错误是:'Salary.cpp:195:47:错误:itoa未在此范围内声明

现在,我已经在全局范围中包含了标题,并且itoa()仅用于我包含的文件中,所以我不知道为什么会发生这种情况,除了它不包括正确的系统头文件。我是否需要在命令行中指定所有系统头?我不太确定发生了什么。

编辑:这是一些源代码......我只是扩展了保持简短所需的内容。错误发生在底部附近的addEmployee()函数中...我不知道我知道如何设置行号。在创建新的Employee()

之后
#include "Employee.h"

#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>
#include <cstdlib>


void findEmployees(Employee*[], const short);
void addEmployee(Employee*[], short&);
unsigned short parseDataFile(Employee* [], short);
bool insertEmployee(Employee*[], short, Employee*);

int main(int argc, char** argv)
{
    //100 employees max, too lazy to create dynamic container
    Employee* employeeList[100];

    //Parse data file, return the length of the list made
    short listLen = parseDataFile(employeeList, 100);

    //Employee database is built, run query engine
    std::cout << "*************************************************\n";
    std::cout << "This program lets you search for salaries of employees or input new employee information.\n";
    std::cout << "*************************************************\n\n\n";

    char choice = { 0 };
    while (true)
    {
        std::cout << "Please choose an option: \n";
        std::cout << "(1) Search for employee salaries.\n";
        std::cout << "(2) Input new employee data\n";
        std::cout << "(3) Exit\n\n";
        std::cin >> choice;

        switch (choice)
        {

        case '1':
            findEmployees(employeeList, listLen - 1);
            break;

        case '2':
            addEmployee(employeeList, listLen);
            break;

        case '3':
            exit(0);
            break;
        }
    }

    return 0;
}

unsigned short parseDataFile(Employee* empList[], short len)
{
    //Do stuff
}

void findEmployees(Employee* empList[], const short len)
{
    //Do stuff
}

void addEmployee(Employee* empList[], short& len)
{
    char first[32] = "";
    char last[32] = "";
    char salary[32] = "";
    char id[32] = "";
    bool loop = true;

    while (loop)
    {
        std::cout << "Input Last Name:  ";
        std::cin.clear();
        std::cin.sync();
        std::cin.getline(last, 31);
        std::cout << std::endl << std::endl;

        std::cout << "Input First Name:  ";
        //Get user name
        std::cin.clear();
        std::cin.sync();
        std::cin.getline(first, 31);
        std::cout << std::endl << std::endl;

        std::cout << "Input Salary:  $";
        //Get user name
        std::cin.clear();
        std::cin.sync();
        std::cin.getline(salary, 31);
        std::cout << std::endl << std::endl;

        Employee* employee = new Employee();
        employee->setID( itoa((int)len, id, 10) ); //Set id

        employee->setFirstName(first); //Set first name
        employee->setLastName(last); //Set last name
        employee->setSalary(salary); //Set salary

        //Inserts new employee at the end of the list, no real reason to sort the list for this assignment
        //I guess I could have used std::vector to make it easy
        empList[len] = employee;
        ++len; //Increment length of the list

        char yesNo = { 0 };
        std::cout << "Would you like to enter another employee?  (Y, N):  ";
        std::cin >> yesNo;
        std::cout << std::endl << std::endl;
        switch (yesNo)
        {
            case 'Y':
            case 'y':
                //do nothing
            break;

            case 'N':
            case 'n':
                loop = false;
            break;

        }        
    }
}

4 个答案:

答案 0 :(得分:3)

  

此函数未在ANSI-C中定义,并且不是C ++的一部分,但是   一些编译器支持。

所以似乎问题是你的编译器不支持itoa函数。

答案 1 :(得分:3)

Linux不提供itoa实施。实现相同行为并使用C ++ 11的最佳方法是以下列方式使用std::to_string

std::string tmp = std::to_string(1);

如果您使用的是较旧的C ++版本,则可以使用字符串流:

std::stringstream tmpSS;
tmpSS << 1;
std::string tmp = out.str();

修改:在提供的示例中,您还需要调用std::string的{​​{1}}方法:

c_str()

其中employee->setID( (char*) tmp.cstr() ); //Set id 是以前的选项之一。

答案 2 :(得分:2)

不确定是什么问题(显示部分代码?)。 itoa是C ++中的非标准函数。

如果要在C ++中将整数转换为字符串,可以在C ++ 11中使用std::to_string函数。

答案 3 :(得分:1)

  1. 如果我们在谈论itoa()简单答案,那么您就不应该使用此功能。它甚至不属于标准C库。当然它与C ++无关。
  2. 如果您仍想使用C样式,请使用适当的格式设置功能,例如snprintf()sprintf()
  3. 如果您真的需要C ++并且支持C ++ 11,请使用std::to_string()
  4. 如果你没有C ++ 11支持但想要成为C ++ native,你可以使用像str :: ostringstream这样的东西。
  5. 没有C ++ 11的C ++的2种方法

    您可以在类/方法中实际包装的最后一种方法的示例:

    int a = 13;
    stringstream ss2;
    ss2 << a;
    string str2 = ss2.str();
    

    替代方案,例如(警告,实际上它有点脏,请使用上面的方法,除非你非常需要它):

    int Number = 123;
    string String = static_cast<ostringstream*>( &(ostringstream() << Number) )->str();