【问题标题】:Why would I get a syntax error near unexpected token? Command line arguments?为什么会在意外标记附近出现语法错误?命令行参数?
【发布时间】:2013-01-22 02:11:15
【问题描述】:

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

$ ./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; 
}

【问题讨论】:

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


    【解决方案1】:

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

    # 开头的前两行被shell 视为cmets。第三行是空白的,什么也不做。第四行被解释为命令int,但括号对shell 来说是特殊的,在这里没有正确使用。你的$PATH 中可能没有int 命令,但shell 没有机会报告这一点,因为它会阻塞语法错误。

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

    看来你已经做了类似chmod +x main.cpp;否则shell会拒绝尝试执行它。使 C++ 源文件可执行不会造成任何真正的危害(只要它是可读和可写的),但它一点用处都没有,而且正如您所见,它延迟了对错误的检测。如果您执行chmod -x main.cpp,然后再次尝试./main.cpp,您将收到“Permission denied”错误。

    正如卡尔的回答所说,您需要执行编译器生成的可执行文件,而不是 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”是我系统使用的可执行格式;该文件包含可执行的机器代码以及一些其他信息。系统预装的命令使用相同的格式。

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

    【讨论】:

      【解决方案2】:

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

      $ a.out "你好" "是"

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

      【讨论】:

        【解决方案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 脚本执行,但这是行不通的。从我在此处对您的程序的测试运行的输出中可以看出,您仍有一些错误需要解决。

        【讨论】:

          猜你喜欢
          • 2022-01-18
          • 2011-05-27
          • 2017-12-03
          • 1970-01-01
          • 1970-01-01
          • 2018-08-29
          • 1970-01-01
          • 2019-03-30
          • 1970-01-01
          相关资源
          最近更新 更多