为什么我会在意外令牌附近出现语法错误?命令行参数?

时间:2013-02-06 18:49:42

标签: c++ input command-line-arguments

这是我的代码 - 不知道为什么我收到此错误消息:

$ ./main.cpp "hello" "is"
./main.cpp: line 4: syntax error near unexpected token `('
./main.cpp: line 4: `int main(int argc, char *argv[]){'

它在g ++中编译很好,但是当我运行它时,我得到了上面的错误。知道为什么吗?这是我的完整代码..

#include <iostream>
#include <fstream>

int main(int argc, char *argv[]){

    for(int i = 0; i < argc; i++){
        std::cout << argc << " : " << argv[i] << '\n';
    }

    if (argc != 2){
        std::cout << "\nUSAGE: 2 command line arguments please." << std::endl;
        std::cout << "\n   (1) Input file with raw event scores.\n   (2) Output file to write into.";
    }

  // open the font file for reading
    std::string in_file = argv[1];
    std::ifstream istr(in_file.c_str());
    if (!istr) { 
        std::cerr << "ERROR: Cannot open input file " << in_file << std::endl;
  }

    return 0; 
}

3 个答案:

答案 0 :(得分:3)

您必须运行已编译的程序,而不是源代码:

$ g++ -o main main.cpp
$ ./main "hello" "is"
3 : ./main
3 : hello
3 : is

USAGE: 2 command line arguments please.

   (1) Input file with raw event scores.
   (2) Output file to write into.ERROR: Cannot open input file hello

您的示例是尝试将C ++代码作为shell脚本执行,但这不起作用。正如您从我的程序测试运行输出中可以看到的那样,您仍然会遇到一些问题。

答案 1 :(得分:2)

正如其他答案所说,您将其作为shell脚本运行,隐式使用/bin/sh

#开头的前两行被shell视为注释。第三行是空白的,什么都不做。第四行被解释为命令int,但括号对于shell是特殊的,并且在这里没有正确使用。 int中可能没有$PATH命令,但shell没有机会报告,因为它会因语法错误而窒息。

这些细节都不是特别重要;问题是你正在执行程序错误。但是,为什么要打印这些特定的错误消息可能会很有趣。

看起来你已经完成了像chmod +x main.cpp这样的事情。否则shell将首先拒绝尝试执行它。使C ++源文件可执行不会造成任何真正的伤害(只要它是可读写的),但它没有任何用处,并且正如您所看到的那样延迟了对错误的检测。如果您执行chmod -x main.cpp,然后再次尝试./main.cpp,则会收到“权限被拒绝”错误。

正如Carl的回答所说,您需要执行编译器生成的可执行文件,而不是C ++源文件。这就是编译器的原因。编译器(实际上是链接器)将自动在它生成的可执行文件上执行等效的chmod +x

file命令会告诉你什么类型的文件,这会影响你可以用它做什么。例如,在运行g++ main.cpp -o main

之后,在我的系统上使用您的代码
$ file main.cpp
main.cpp: ASCII C program text
$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xacee0dfd9ded7aacefd679947e106b500c2cf75b, not stripped
$ 

file命令应该将main.cpp识别为C ++而不是C,但有时它会猜错。)

“ELF”是我的系统使用的可执行格式;该文件包含可执行的机器代码以及一些其他信息。系统上预安装的命令使用相同的格式。

您的系统的详细信息可能有所不同 - 并且在非Windows类系统(如MS Windows)上会有很大差异。例如,在Windows上,可执行文件通常以.exe扩展名命名。

答案 2 :(得分:0)

默认情况下,编译器会创建一个名为“a.out”的可执行文件,因此您需要执行以下操作:

  

$ a.out“你好”“是”

键入“./main.cpp”正在尝试执行C ++源文件,可能是作为shell脚本