C++ 为什么在意外标记附近会出现语法错误?命令行参数?

C++ 为什么在意外标记附近会出现语法错误?命令行参数?,c++,input,command-line-arguments,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 &l

以下是我的代码-不确定为什么会收到此错误消息:

$ ./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; 
}
#包括
#包括
int main(int argc,char*argv[]){
对于(int i=0;istd::cout您必须运行已编译的程序,而不是源代码:

$ 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脚本执行,这是行不通的。从你的程序运行测试结果来看,你仍然有一些错误要解决。

< p>编译器默认地创建一个名为“A.OUT”的可执行文件,所以你想做:

$a.out“你好”是


类型:“./main .CPP”正在尝试执行C++源文件,可能是shell脚本

,因为其他两个答案都说,你把它作为shell脚本运行,隐式使用/bin /s shell将以
#
开头的前两行视为注释。第三行为空,不做任何操作。第四行被解释为命令
int
,但括号是shell特有的,在这里使用不正确。
$PATH
中可能没有
int
命令>,但是shell没有机会报告,因为它被语法错误阻塞了

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

并且,您似乎已经做了一些事情,比如代码> CHMOD+X Meal.CPP;否则shell将首先拒绝执行它。C++源文件可执行不会造成任何真正的伤害(只要它是可读和可写的),但它一点用处都没有,正如您所看到的,它延迟了对错误的检测。如果您执行

chmod-x main.cpp
,然后再次尝试
/main.cpp
,则会出现“权限被拒绝”错误

正如卡尔的回答所说,你需要执行编译器生成的可执行文件,而不是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
$ 
<> >(<代码>文件< /C>命令应该已经识别了代码>主文件.CPP <代码>作为C++而不是C,但有时它猜错了。 “ELF”是我的系统使用的可执行格式;该文件包含可执行的机器代码以及一些其他信息。系统上预装的命令使用相同的格式

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