当#include <stack>和#include <queue>时,C ++程序不会编译

时间:2018-01-24 05:28:27

标签: c++ macos vim utf-8

我在Mac OS X上使用vim,而我的vimrc包含以下键映射:

function! CPPSET()
   set makeprg=if\ \[\ -f\ \"Makefile\"\ \];then\ make\ $*;else\ if\ \[\ -f\ \"makefile\"\ \];then\ make\ $*;else\ g++\ -std=gnu++0x\ -O2\ -g\ -Wall\ -Wextra\ -o\ %<\ %;fi;fi
set cindent
set nowrap
nnoremap <buffer> <F9> :w<cr>:!g++ -O2 % -o %< -std=c++14 -I ./<cr>:!./%<<cr>
nnoremap <buffer> <F8> :w<cr>:!g++ -Wall -Wextra -Wshadow -O2 % -o %< -std=c++11 -I ./<cr>
endfunction

当我按F9时,我使用这些键映射来编译和运行。它工作正常,直到今天:我注意到文件不会编译,并在包含这些标题时出现以下错误:

#include <stack>
#include <queue>

我注意到当我从cpp文件中删除两个这些头文件时,它工作正常。此外,当我尝试使用

编译该文件(包含这两个标题)时
g++ hello.cpp (instead of using F9 in Vim)

它运作得很好。请看一下!我尝试重新安装xcode,但它没有用。

In file included from queue.cpp:16:
./queue:1:1: error: source file is not valid UTF-8
<CF><FA><ED><FE><U+0007><U+0000><U+0000><U+0001><U+0003><U+0000>
<U+0000><80><U+0002><U+0000><U+0000><U+0000><U+0010><U+0000><U+0000>
<U+0000>p<U+0006><U+0000><U+0000><85>...

./queue:1:2: error: source file is not valid UTF-8
<CF><FA><ED><FE><U+0007><U+0000><U+0000><U+0001><U+0003><U+0000>
<U+0000><80><U+0002><U+0000><U+0000><U+0000><U+0010><U+0000><U+0000>
<U+0000>p<U+0006><U+0000><U+0000><85>...


./queue:1:5: error: expected unqualified-id
<CF><FA><ED><FE><U+0007><U+0000><U+0000><U+0001><U+0003><U+0000>
<U+0000><80><U+0002><U+0000><U+0000><U+0000><U+0010><U+0000><U+0000>
<U+0000>p<U+0006><U+0000><U+0000><85>...
            ^
./queue:1:6: warning: null character ignored [-Wnull-character]
<CF><FA><ED><FE><U+0007><U+0000><U+0000><U+0001><U+0003><U+0000>
<U+0000><80><U+0002><U+0000><U+0000><U+0000><U+0010><U+0000><U+0000>
<U+0000>p<U+0006><U+0000><U+0000><85>...
                    ^
./queue:1:7: warning: null character ignored [-Wnull-character]
<CF><FA><ED><FE><U+0007><U+0000><U+0000><U+0001><U+0003><U+0000>
<U+0000><80><U+0002><U+0000><U+0000><U+0000><U+0010><U+0000><U+0000>
<U+0000>p<U+0006><U+0000><U+0000><85>...

...continue

编辑:

  • 这就是Syntastic所指出的:here

  • 当我使用g ++编译时,它可以无缝地工作:here

  • 评论#include,#include和Syntastic满意:here

1 个答案:

答案 0 :(得分:2)

您的(根据您的图片)您的工作目录中有一个名为queue的二进制文件(可能是可执行文件)。由于某些奇怪的原因,您需要发现它,它包含在#include <queue>中(查看编辑器或IDE传递给g++的实际程序参数)。删除该文件。

(根据经验,避免使用与计算机上通常相同的名称来命名程序;拥有名为queue的可执行文件对C ++的不良品味显影剂)功能

您可能希望将-H传递给g++,以了解所包含的文件。

然后花几个小时或几天阅读Invoking GCC上的文档,并学会使用build automationGNU make之类的ninja工具。对于make,请阅读documentation of make,然后编写您自己的Makefile(警告:标签字符很重要)。对于ninja,请参阅this。您需要了解应如何调用g++

最后,阅读source code editor(或IDE)的文档,并根据您的需要和品味对其进行配置。您可能希望它在单个功能按键上运行一些makeninja命令。如何做到这一点在文档中解释。对于vim,请参阅this

要理解的重要一点是,IDE只是能够运行一些外部命令来构建软件的源代码编辑器。您可以配置该命令。 C ++编译器 - 实际上 - 总是命令行程序(通常是GCCClang),你需要学习如何调用它们(你通常更喜欢使用构建自动化工具来运行编译命令)。