首页 > C/C++, IDE, 中级 > 用flymake检测C/C++语法

用flymake检测C/C++语法

1 前言

前段时间ahei使劲推荐flymake,而且在dea中还给出一段flymake配置,勾起了我学习flymake的兴趣。在此之前只是听说过flymake,偶尔浅尝一下还没学会怎么用就放弃了,这几天折腾flymae后觉得实在很给力。生活不是缺少美,而是缺少发现美的眼睛这话说得还真有点道理。

2 flymake基本用法

flymake是一个实时的语法检查工具,好像是从emacs22开始已经自带flymake,自带的flymake提供了对C,C++,XML,HTML,C#,perl,php,java,tex,idl的支持。查看flymake-allowed-file-name-masks这个变量可以得到支持语言的详细信息。想要了解其它语言的支持,可以看看http://www.emacswiki.org/FlyMake

在以下四种情况下,flymake会执行语法检测:

  • 打开文件时
  • 换行(可通过flymake-start-syntax-check-on-newline配置)
  • 代码改变0.5秒后(可通过flymake-no-changes-timeout配置)
  • 手工执行flymake-start-syntax-check

下面是flymake基本配置:

(autoload 'flymake-find-file-hook "flymake" "" t)
(add-hook 'find-file-hook 'flymake-find-file-hook)
(setq flymake-gui-warnings-enabled nil)
(setq flymake-log-level 0)

加上以上配置后,打开文件时会检测是否是flymake支持的语言,是的话就会自动打开flymake-mode。flymake-gui-warnings-enabled设置为nil表示出错时不弹个对话框显示错误;flymake-log-level设置为0表示记录错误日志。

本文主要讨论C/C++(因为别的我不会),自带的flymake对C/C++的支持是通过Makefile实现的,Makefile中必须有一个check-syntax目标,比如我在Linux下用automake,那我在Makefile.am中加了这么一段(其实就是调用gcc):

?View Code MAKEFILE
check-syntax:
    $(CXXCOMPILE) -Wall -Wextra -pedantic -fsyntax-only $(CHK_SOURCES)

如果不用automake,手写Makefile的话,相应地修改一下就行了。

有了这些设置后,打开项目中的cpp文件,应该会自动检测语法了,语法有错误的话会用颜色标识出错的行,M-x flymake-goto-next-error和M-xflymake-goto-prev-error可以在错误行间移动;鼠标在错误行上停留会用tooltip显示错误信息;M-x flymake-display-err-menu-for-current-line能弹出一个菜单显示错误。

另外,ahei写了几个函数可以在错误行间移动时在minibuffer显示出错误信息:

(defun flymake-display-current-error ()
  "Display errors/warnings under cursor."
  (interactive)
  (let ((ovs (overlays-in (point) (1+ (point)))))
    (catch 'found
      (dolist (ov ovs)
        (when (flymake-overlay-p ov)
          (message (overlay-get ov 'help-echo))
          (throw 'found t))))))
(defun flymake-goto-next-error-disp ()
  "Go to next error in err ring, then display error/warning."
  (interactive)
  (flymake-goto-next-error)
  (flymake-display-current-error))
(defun flymake-goto-prev-error-disp ()
  "Go to previous error in err ring, then display error/warning."
  (interactive)
  (flymake-goto-prev-error)
  (flymake-display-current-error))

我把它绑定到了这几个按键:

(defvar flymake-mode-map (make-sparse-keymap))
(define-key flymake-mode-map (kbd "C-c <f4>") 'flymake-goto-next-error-disp)
(define-key flymake-mode-map (kbd "C-c <S-f4>") 'flymake-goto-prev-error-disp)
(define-key flymake-mode-map (kbd "C-c <C-f4>")
  'flymake-display-err-menu-for-current-line)
(or (assoc 'flymake-mode minor-mode-map-alist)
    (setq minor-mode-map-alist
          (cons (cons 'flymake-mode flymake-mode-map)
                minor-mode-map-alist)))

编辑过程中,每次修改过代码0.5秒后,flymake都会检测错误,这就可以随时发现代码编写的错误了。

在这补充一下flymake检测的方法:

对于cpp文件,每次检测时,flymake是把buffer内的内容另存一份,再检测另存出来的文件。

而对于h文件,gcc没办法单独检查头文件,flymake会在flymake-master-file-dirs设定的目录中查找include过这个头文件的实现文件,把buffer另存为xxx_flymake.h,把查找到的第一个满足条件的实现文件另存yyy_flymake_master.cpp,并把里面的include语句改为include另存的文件,然后通过yyy_flymake_master.cpp来间接检测头文件。

3 ahei的改进

自带的flymake对C++只能通过Makefile来支持,还必须在Makefile中加入check-syntax目标,实在很麻烦。要是代码不是通过Makefile来管理的,flymake就无能为力了。

其实Makefile也是通过gcc来检测代码了,那要是跳过Makefile直接调用gcc来检测代码该多好啊,所以aheiDEA中配置了flymake直接调用gcc检测C++代码,具体代码在flymake-setting.el中,主要是以下几个函数:

(defvar flymake-makefile-filenames '("Makefile" "makefile" "GNUmakefile") "File names for make.")
 
(defun flymake-get-make-gcc-cmdline (source base-dir)
  (let (found)
    (dolist (makefile flymake-makefile-filenames)
      (if (file-readable-p (concat base-dir "/" makefile))
          (setq found t)))
    (if found
        (list "make"
              (list "-s"
                    "-C"
                    base-dir
                    (concat "CHK_SOURCES=" source)
                    "SYNTAX_CHECK_MODE=1"
                    "check-syntax"))
      (list (if (string= (file-name-extension source) "c") "gcc" "g++")
            (list "-o"
                  "/dev/null"
                  "-S"
                  source)))))
 
(defun flymake-simple-make-gcc-init-impl (create-temp-f use-relative-base-dir use-relative-source build-file-name get-cmdline-f)
  "Create syntax check command line for a directly checked source file.
Use CREATE-TEMP-F for creating temp copy."
  (let* ((args nil)
         (source-file-name buffer-file-name)
         (buildfile-dir (file-name-directory source-file-name)))
    (if buildfile-dir
        (let* ((temp-source-file-name  (flymake-init-create-temp-buffer-copy create-temp-f)))
          (setq args
                (flymake-get-syntax-check-program-args
                 temp-source-file-name
                 buildfile-dir
                 use-relative-base-dir
                 use-relative-source
                 get-cmdline-f))))
    args))
 
(defun flymake-simple-make-gcc-init ()
  (flymake-simple-make-gcc-init-impl 'flymake-create-temp-inplace t t "Makefile" 'flymake-get-make-gcc-cmdline))

主要思路就是先检测Makefile文件,如果存在就调用make,否则就直接调用gcc检测。

4 我的修改

ahei配置的gcc非常实用,我就是因为它喜欢上flymake的,不过用过几天后,发现ahei的配置里有几个问题没解决:

  • 没有对make或gcc进行检测

    flymake进行语法检测都是通过调用外部程序来实现的,比如make或gcc,如果没有安装这两个程序,flymake还是会死心眼地启动一个process去调用。

  • 不支持用gcc直接检测头文件

    ahei好像是把头文件忘掉了。

  • 目标没有权限写入时会出错

    因为flymake检测文件时会把buffer内容另存到一个临时文件中再检测,如果我以普通用户身份打开/usr/include/下的头文件,或者/usr/src/下的实现文件时,flymake会报靠说权限有问题,并且你会发现这个文件没在emacs中被打开。

  • 不支持父目录中的Makefile

    原始的flymake调用flymake-init-find-buildfile-dir来查找Makefile,它会从当前目录一直往上找,直到根目录为止,只要找到Makefile都可以。这有一个好处就是对一个有很多子目录的大工程,不需要对每个子目录下的Makefile文件都加上check-syntax目标,只需要在最顶层的Makefile中加就可以了。但ahei修改的时候可能是因为flymake-init-find-buildfile-dir找不到Makefile就会报错退出而无法转而使用gcc而放弃了这个函数,改为只在当前目录下找Makefile文件而不支持查找父目录了。

我的配置主要是在ahei的基础上进行修改,解决了这几个我发现的问题:

1.没有检测make或gcc存在的问题,我在配置文件中先检测有没有对应的外部程序,没有的话就不配置到flymake-allowed-file-name-masks中了。

2.我加了两个函数:flymake-master-make-gcc-header-init和flymake-master-make-gcc-init来支持直接用gcc检测头文件。

3.用ignore-error忽略掉权限错误,用flymake-report-fatal-status把错误通过minibuffer报告出来。

4.用flymake-find-buildfile来查找Makefile文件,能支持父目录Makefile查找。

修改后的代码如下(完整的配置见http://github.com/meteor1113/dotemacs/blob/master/init-basic.el):

(setq flymake-allowed-file-name-masks '())
(when (executable-find "texify")
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.tex\\'" flymake-simple-tex-init))
  (add-to-list 'flymake-allowed-file-name-masks
               '("[0-9]+\\.tex\\'"
                 flymake-master-tex-init flymake-master-cleanup)))
(when (executable-find "xml")
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.xml\\'" flymake-xml-init))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.html?\\'" flymake-xml-init)))
(when (executable-find "perl")
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.p[ml]\\'" flymake-perl-init)))
(when (executable-find "php")
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.php[1]?\\'" flymake-php-init)))
(when (executable-find "make")
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.idl\\'" flymake-simple-make-init))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.java\\'"
                 flymake-simple-make-java-init flymake-simple-java-cleanup))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.cs\\'" flymake-simple-make-init)))
(when (or (executable-find "make")
          (executable-find "gcc")
          (executable-find "g++"))
  (defvar flymake-makefile-filenames '("Makefile" "makefile" "GNUmakefile")
    "File names for make.")
  (defun flymake-get-gcc-cmdline (source base-dir)
    (let ((cc (if (string= (file-name-extension source) "c") "gcc" "g++")))
      (list cc
            (list "-Wall"
                  "-Wextra"
                  "-pedantic"
                  "-fsyntax-only"
                  "-I.."
                  "-I../include"
                  "-I../inc"
                  "-I../common"
                  "-I../public"
                  "-I../.."
                  "-I../../include"
                  "-I../../inc"
                  "-I../../common"
                  "-I../../public"
                  source))))
  (defun flymake-init-find-makfile-dir (source-file-name)
    "Find Makefile, store its dir in buffer data and return its dir, if found."
    (let* ((source-dir (file-name-directory source-file-name))
           (buildfile-dir nil))
      (catch 'found
        (dolist (makefile flymake-makefile-filenames)
          (let ((found-dir (flymake-find-buildfile makefile source-dir)))
            (when found-dir
              (setq buildfile-dir found-dir)
              (setq flymake-base-dir buildfile-dir)
              (throw 'found t)))))
      buildfile-dir))
  (defun flymake-simple-make-gcc-init-impl (create-temp-f
                                            use-relative-base-dir
                                            use-relative-source)
    "Create syntax check command line for a directly checked source file.
Use CREATE-TEMP-F for creating temp copy."
    (let* ((args nil)
           (source-file-name buffer-file-name)
           (source-dir (file-name-directory source-file-name))
           (buildfile-dir
            (and (executable-find "make")
                 (flymake-init-find-makfile-dir source-file-name)))
           (cc (if (string= (file-name-extension source-file-name) "c")
                   "gcc"
                 "g++")))
      (if (or buildfile-dir (executable-find cc))
          (let* ((temp-source-file-name
                  (ignore-errors
                    (flymake-init-create-temp-buffer-copy create-temp-f))))
            (if temp-source-file-name
                (setq args
                      (flymake-get-syntax-check-program-args
                       temp-source-file-name
                       (if buildfile-dir buildfile-dir source-dir)
                       use-relative-base-dir
                       use-relative-source
                       (if buildfile-dir
                           'flymake-get-make-cmdline
                         'flymake-get-gcc-cmdline)))
              (flymake-report-fatal-status
               "TMPERR"
               (format "Can't create temp file for %s" source-file-name))))
        (flymake-report-fatal-status
         "NOMK" (format "No buildfile (%s) found for %s, or can't found %s"
                        "Makefile" source-file-name cc)))
      args))
  (defun flymake-simple-make-gcc-init ()
    (flymake-simple-make-gcc-init-impl 'flymake-create-temp-inplace t t))
  (defun flymake-master-make-gcc-init (get-incl-dirs-f
                                       master-file-masks
                                       include-regexp)
    "Create make command line for a source file
 checked via master file compilation."
    (let* ((args nil)
           (temp-master-file-name
            (ignore-errors
              (flymake-init-create-temp-source-and-master-buffer-copy
               get-incl-dirs-f
               'flymake-create-temp-inplace
               master-file-masks
               include-regexp)))
           (cc (if (string= (file-name-extension buffer-file-name) "c")
                   "gcc"
                 "g++")))
      (if temp-master-file-name
          (let* ((source-file-name buffer-file-name)
                 (source-dir (file-name-directory source-file-name))
                 (buildfile-dir
                  (and (executable-find "make")
                       (flymake-init-find-makfile-dir source-file-name))))
            (if (or buildfile-dir (executable-find cc))
                (setq args (flymake-get-syntax-check-program-args
                            temp-master-file-name
                            (if buildfile-dir buildfile-dir source-dir)
                            nil
                            nil
                            (if buildfile-dir
                                'flymake-get-make-cmdline
                              'flymake-get-gcc-cmdline)))
              (flymake-report-fatal-status
               "NOMK"
               (format "No buildfile (%s) found for %s, or can't found %s"
                       "Makefile" source-file-name cc))))
        (flymake-report-fatal-status
         "TMPERR" (format "Can't create temp file for %s" source-file-name)))
      args))
  (defun flymake-master-make-gcc-header-init ()
    (flymake-master-make-gcc-init
     'flymake-get-include-dirs
     '("\\.cpp\\'" "\\.c\\'")
     "[ \t]*#[ \t]*include[ \t]*\"\\([[:word:]0-9/\\_.]*%s\\)\""))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.\\(?:h\\(?:pp\\)?\\)\\'"
                 flymake-master-make-gcc-header-init flymake-master-cleanup))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.\\(?:c\\(?:pp\\|xx\\|\\+\\+\\)?\\|CC\\)\\'"
                 flymake-simple-make-gcc-init)))

5 检测python语法

因为偶尔我也用下python,所以我也希望flymake能把python也支持了。python有三个语法检测工具,我比较之后选择了pyflakes。

装好pyflakes后,加入以下配置就可以像检测cpp那样检测py文件了:

(when (executable-find "pyflakes")
  (defun flymake-pyflakes-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
           (local-file (file-relative-name
                        temp-file
                        (file-name-directory buffer-file-name))))
      (list "pyflakes" (list local-file))))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.py\\'" flymake-pyflakes-init)))

如果是在windows下的话,可能会找不到pyflakes这个外部程序,因为C:\Python25\Scripts\pyflakes没被windows识别为可执行文件,我是在C:\Python25\Scripts\下加了个pyflakes.bat的文件,文件里写入以下内容就能正常检测了:

C:\Python25\python.exe C:\Python25\Scripts\pyflakes %*

6 遗留问题

有两个问题我还没解决:

一、对C++来说,找不到Makefile的时候自动改用gcc语法检测,但有时候看别人工程时会碰到有Makefile,但里面没有写check-syntax目标的问题(从网上下载的开源代码很少有在Makefile中写check-syntax目标的)。要是能配置成在Makefile中找不到check-syntax目标后也能自动改用gcc检测就好了。

二、flymake通过定时器,改变代码超过0.5秒后进行语法检测,其实我不太喜欢这种立即检测的方式,相比之下我更喜欢保存文件后进行检测。要是下个版本的flymake可以把这两种方式做成可配置就好了。

分享家:Addthis中国
GD Star Rating
loading...
用flymake检测C/C++语法, 7.8 out of 10 based on 24 ratings 该日志未加标签。
分类: C/C++, IDE, 中级
  1. seagle
    2010年12月6日00:29 | #1

    不错。也可以用VC的编译器来检查,对于一些小程序还是可以的。不过对于大工程就无能为力了,性能也成问题。这是我的配置:

    ;; checking C/C++ mode for VC
    (defun flymake-vc-init ()
      (flymake-simple-make-init-impl 'flymake-create-temp-inplace t t (file-name-nondirectory buffer-file-name) 'flymake-get-vc-cmdline))
     
    (defun flymake-get-vc-cmdline (source base-dir)
      (list "cl" (list "/EHsc /Wall" (concat base-dir source))))
     
    (add-to-list 'flymake-allowed-file-name-masks
             '("\\.\\(?:c\\(?:pp\\|xx\\|\\+\\+\\)?\\|CC\\)\\'" flymake-vc-init))
     
    (add-hook 'c-mode-hook 
              '(lambda() (local-set-key "\C-c\C-v" 'my-flymake-show-next-error)))
    (add-hook 'c++-mode-hook 
              '(lambda() (local-set-key "\C-c\C-v" 'my-flymake-show-next-error)))

    [回复]

    meteor1113 回复:

    @seagle, 太好了,不介意我把这段配置整合到我的配置里吧?
    另外,我刚开始用flymake,能详细说说对大工程,flymake会受到怎么样的影响吗?

    [回复]

    seagle 回复:

    @meteor1113,
    当然不介意了。既然贴出来就是大家交流,开源的好处嘛。
    至于性能,我的下面回复有说明的,主要是耗CPU吧。

    [回复]

    ahei 回复:

    @seagle, 为什么会有性能影响呢?flymake只调用gcc编译一个文件, 也不link, 除非那个文件特别大, 否则不应该会有性能影响阿

    [回复]

    seagle 回复:

    @ahei,
    编译也是很耗CPU的活,对于大文件而言频繁的更改更会导致频繁的编译,对于老机器有时是不可忍受的。
    可能是我的机器太破了吧,呵呵:wink:

    [回复]

    meteor1113 回复:

    @seagle,
    用我机器上的vc2010试了试,发现几个问题:
    1. vc好像没有gcc的-fsyntax-only参数啊,就是只检查语法不编译
    2. 从命令行调用cl连iostream这样的标准头文件都找不到啊,vc好像用vcvarsall.bat来设置环境变量,在emacs中能调用bat来设环境变量吗?如果我直接在系统中设置PATH和INCLUDE的话好像又不太方便。
    3. 我随便找了个gcc编译没问题的代码,用cl的/Wall报了一大堆警告,都是vc自带的头文件的警告

    [回复]

    ahei 回复:

    @meteor1113, 没有-fsyntax-only也可以的阿,我的就没加这个参数, 大不了就只编译一个文件呗:

    check-syntax:
    	$(GCC) $(CPPFLAGS) -c ${CHK_SOURCES} -o /dev/null $(INCLUDES)

    [回复]

    meteor1113 回复:

    @ahei,
    我提这个是因为windows下不能用/dev/null,不过gcc可以-o到临时目录去,cl我还没找到怎么指定输出文件

    [回复]

    seagle 回复:

    @meteor1113,
    自己写一个cl.bat,内容如下:

    @echo off

    @call “C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat” x86
    cl /EHsc %1 %2 %3 %4 %5 %7 %8 %9

    至于只检查不编译我倒没有仔细研究过,可能没有吧。我认为更好的办法应该是用lint,可惜配置也挺麻烦,还收费。

    [回复]

  2. zbelial
    2010年12月6日11:08 | #2

    我倒是改过flymake,可以指定使用的makefile文件的名字。不知道有没有人需要。
    另外确实如seagle所说,工程大的时候性能是个问题,作者主页上也有说明。

    [回复]

    meteor1113 回复:

    @zbelial, 怎么指定呢?是像ahei那个那样指定几个Makefile名字挨个查找还是提示用户输入啊?
    把主要修改发出来吧,肯定会有人能用得上的。
    另外,flymake每次只检查一个文件,为啥对性能会有大影响呢。我能想到的就是工程大了头文件多,include太多头文件时可能会慢,否则flymake的性能应该不受工程大小的限制的吧。

    [回复]

    ahei 回复:

    @meteor1113, 对阿,我的想法和meteor是一样的

    [回复]

    ahei 回复:

    @meteor1113, 我有空看看你说的遗留问题, 第一个问题可能有方法搞定, 这样的话就非常方便了, 不需要写Makefile

    [回复]

    zbelial 回复:

    @meteor1113, 哦,我没看ahei的修改,我的修改就跟你说的似的,
    指定几个makefile文件,挨个查找,找到第一个就结束,至于里面有没有check-syntax没有做检查,所以也不是很实用,我自己也都不太用。
    至于性能问题,确实是单个文件比较大,或者包含头文件比较多的时候,并不一定是工程大,上面
    说的不准确。

    PS.
    1. 话说c++编译起来本来就比较慢,就算只是做语法检查应该也不会很快,尤其文件大的时候。
    2. 不知道clang在做语法检查方面速度有多大提高,这两天在看libclang,写了一点小程序学习了一下,还是挺好用的,只是文档有点少,不知道有没有其他人了解clang的。

    [回复]

    seagle 回复:

    @zbelial,
    对啊,C++的文件编译很慢,如果用过pc-lint更有体会。当然,lint其实是更严格的编译器,并不只是检查语法,使用起来相当的耗CPU。我想C++光检查语法好像意义也不大吧。

    [回复]

    meteor1113 回复:

    @zbelial,
    1.编译慢确实是C++的软肋,不过硬件发展速度还是很快的。对大文件我觉得可以把flymake默认的0.5秒使劲延长(比如5分钟,一般写代码的时候超过几分钟都没修改的话恐怕就是干别的去了吧),这样即使让flymake在空闲时候检查一下也不错。
    2.clang用来做代码补全还真不错。编译速度据说是比gcc有所提高,不过我觉得肯定还是有限,不可能一下子提高多少倍,特别是如果有大量模板的话。

    [回复]

  3. 2010年12月9日10:21 | #3

    …..能检测基本的语法错误我觉得很不错,主要的错误避免还是掌握在程序员手里。。
    至于,ahei的语法检测配置我还没研究,有时间研究下~

    [回复]

  4. vmlinz
    2010年12月10日16:31 | #4

    auto-complete-clang 在补全的同时就会对代码的语法进行检查。。。

    [回复]

    ahei 回复:

    @vmlinz, 这么强悍,不过我不补全的时候也想进行语法检查阿, 而且flymake能覆盖很多语言,还是非常强悍的

    [回复]

    vmlinz 回复:

    @ahei,

    auto-complete-clang 也是用的一个“-syntax-only”参数。它必须要求编译没错才能出补全,
    总觉得是个bug。。。

    当然如果是工程的话,它还是不行的,它只检查当前一个文件

    http://fwd4.me/quG

    [回复]

    vmlinz 回复:

    @vmlinz,

    链接给错了。。http://goo.gl/h7TmI

    [回复]

    ahei 回复:

    @vmlinz, 那看来还不是太实用阿

    [回复]

    vmlinz 回复:

    @ahei,

    恩,其实是它的一个bug来着,检查语法用flymake还是很爽的。各种语言都搞得定

    [回复]

    ahei 回复:

    @vmlinz, 也不是bug,vc一开始也是需要编译成功才能补全和跳转的

    [回复]

    Jain 回复:

    @vmlinz,
    应该不是bug。因为clang的补全好像是在编译成功之后才能检测出补全内容的,
    不是基于语义的吧。

    [回复]

    风间星魂 回复:

    @vmlinz,
    作者的bug

    把那个函数改成如下既可在任何情况下弹补全
    (defsubst ac-clang-build-location (pos)
    (save-excursion
    (goto-char pos)
    (format “%s:%d:%d” buffer-file-name (line-number-at-pos)
    1
    )))

    [回复]

  5. 创新者
    2011年3月15日22:24 | #5

    :wink: 不错啊

    [回复]

  6. cheng
    2013年1月26日20:54 | #6

    博主还有一个问题,我这样使用,flymake也会显示白色错误标志,但是又没有错误提示,只有一个白色标志,博主,可以告诉下这个怎么解决呀?
    #include
    #include”postil.h”

    [回复]

  7. cheng
    2013年1月26日20:55 | #7

    博主还有一个问题,我这样使用,flymake也会显示红色错误标志,但是又没有错误提示,只有一个白色标志,博主,可以告诉下这个怎么解决呀?
    #include //C++头文件
    #include”postil.h” // 自定义头文件

    [回复]

  8. 2016年3月27日03:43 | #8

    The cost estimates were based on data for materials, labor and systems not actual designs and contract bids, Doug Obletz, the project consultant hired by the county, said last week. With the OK from commissioners, county engineers can move forward in working with architects and contractors on developing specific designs for the project. will design the project and will build it. coach factory outlet “We’re not an overpowering team, but we were competitive against those four. g michael kors outlet online
    Rodriquez also credits ACES with helping her increase her grade point average. coach outlet store online “Obviously this is not where we want to be,” quarterback Ryan Tannehill said, “but here we are.
    This is not the first time Brown has been investigated over an incident involving his temper. In January 2014, the East Baton Rouge Sheriff’s Office looked into an apparent road rage incident in which a woman driver said she was cut off by Brown and threatened with arrestwhen he flashed a state legislator badge her way. Brown apologized 11 dayslater and authorities ultimately determined no laws were broken in that incident. coach outlet online Formal policies might help, since who, how, and why officers search for students is a haphazard process. k cheap nfl jerseys
    Scarinci Hollenbeck () is among the most highly ranked law firms in the region, with offices in New York, New Jersey and Washington, D. michael kors bags Here is my bottom line, educational performance of too many our students is poor, and having a de facto segregation system of one-school districts with their own administrators is never going to improve the education in the county as a whole.
    p Blackjack chef Peter Steward will be preparing lamb rack, salmon, tenderloin medallions, duck and other house specialties, while Merriam will introduce his property’s Cabernet Sauvignon, Pinot Noir, Cabernet Franc, SNED Red Blend, and Sauvignon Blanc. coach outlet Rick Perry for less. coach factory outlet store
    Roland Gutierrez, president of the Tucson Police Officers Association, said he had not talked to members and would not be able to speak for the officers yet. cheap oakleys Cienega at Tolleson Union, 6 p. http://www.coachfactorysoutlet.com
    Decisions, decisions ray ban sunglasses Kellogg Foundation in Battle Creek, Mich. p louis vuitton handbags
    LOOKING BACK: It wasn’t a great three-game set for the Bears this week. michael kors outlet Valencia, Jr.
    Remember when Austin Peay won the Ohio Valley Conference tournament a few days ago and you thought it would be the biggest underdog to reach the NCAA tournament this season?Jeez, were you wrong. coach factory outlet store Gage Griffin, FS Northside^12^82^6.
    OPS (. oakley glasses “But at a panel discussion Thursday on the structural deficit, representatives of CAP and Southern California’s Metropolitan Water District didn’t portray each other as adversaries.
    The failure of Yahoo to exercise or enforce any right or provision of the TOS shall not constitute a waiver of such right or provision. michael kors bags He got his first opportunity of the spring and lined out and grounded out.
    l Hallmark, one of America s most trusted brands, reveals artist-crafted home décor collections designed to inspire a welcoming home coach outlet Murphy, standing at 6-foot-6, 261 pounds, is a defensive machine.
    $50 for adults, includes wine tasting and s’mores; kids are free. coach outlet We all love football. h michael kors outlet
    Pat Kelly said people in the community have been willing to help in whatever way they can. michael kors outlet Worth it for many.
    e Timothy E. Lofland to Timothy E. Lofland and Cheryl A. Lofland, 229 Jabish St., $100. oakley glasses “Whatever it takes, we will go. b
    Penn State’s director of player personnel, Andy Frank, shedsome light on the logistics of coach and player visits and how those plans often change “from hour to hour” leading up to National Signing Day. coach outlet store Most importantly, she enjoyed the camaraderie with other kids who were also visually impaired. michael kors outlet store
    Get pot right http://www.cheapchinajerseysnfl.us.org Brandon Vanover sparked Baptist Prep with a 3pointer after his brother Connor dunked for 1312 lead. v coach outlet
    Redskins get a huge win over the NY Giants for a share of the NFC East division lead. louis vuitton outlet 37 with second place going to Tempe Prep’s Catherine Bryant in 16:28.
    “I’m very confident that we’ll start connecting on those,” Thomas said. “The looks are there, and the opportunities are there. As we get a better feel for each other, it’s going to come along.” coach outlet online “Paul Signac Drawings and Watercolors, the James T. q oakley sunglasses
    to organize artist-led classes, tours, workshops, seminars, and lectures in a wide variety of disciplines — both within the art museum and at off-site locations (outreach). louis vuitton handbags To aid comprehension and a deeper understanding, encourage your student to decode the unknown on their own before getting completely sidetracked or skipping it altogether.

    [回复]

  9. 2016年4月7日21:04 | #9

    Ronald A. Wagner and Carol A. Bailey to Dmitry Voloshinov and Kristie Voloshinov, 146 Tower Hill Road, $388,000. michael kors bags “We’ve got most of the original course. j michael kors outlet
    “I said, ‘What are you doing here so early?’ He said, ‘I was here to say goodbye to my teammates and wish them well. michael kors online The Cardinals, 35 games above .
    Drinking eggnog, caroling and visiting other families’ homes are some of the hallmarks of the holiday season. Who doesn’t want to see how other people decorate? louis vuitton outlet online Why wouldn’t you want an entire Windows computer on a tiny little stick? As someone who uses a MacBook day in and day out, the idea of $159 Intel’s Compute Stick, a Windows 10 PC shrunken down to the size of a tiny plastic rectangle, really pulls me in. r http://www.louisvuitton-outlet.us.org
    It was the second consecutive loss for Eastern Conference-leading Cleveland, which is in the middle of a stretch of three games in four days http://www.coachoutletssonline.us.org The Hollister American 9-10 All-Star team never knew what it was like to play from behind—until the District 9 tournament championship game on July 11.
    g The 610 Stompers made a surprise appearance duringtheir flight to New York, too. michael kors outlet Is it safe to keep using this car if the tranny slips periodically? We ve had no problems on the highway. michael kors outlet store
    Resident Earl Follett said selling to a private company ensures rates will increase michael kors outlet I can’t do that!Once at check-in for her exercise class I had my back to her, then heard a gasp from several onlookers. http://www.michaelkorshandbags.us.org
    Picker expects the trial to take two years to complete. michael kors outlet Who would Hutchinson appoint should Goodson win? m michael kors outlet store
    They’re lucky to be a 4, especially now that Amile Jefferson has been ruled out for the season with a stress fracture in his right foot. wholesale nfl jerseys Organizers tried to keep the ceremony under wraps, but details leaked out in the British media.
    ” Since then, the pop star has released twoalbums, won an American Music Award for Favorite Adult ContemporaryArtist, and been nominated for two MTV Video Music Awards and oneGrammy. coach handbags However, most of it does not show the interrelationship between technology, market developments, strategies of producers and, in particular, raw material supply.
    When it comes to matters of the environment our membership of the EU serves to protect ournational identity, not to undermine it. michael kors outlet online Phoenix Art Museum admission will be free today and Sunday, as well as the first full weekend of each month in 2015.
    More like three or four. coach outlet Some will choose private schools.
    j It has whitegreen blossoms and looks like a pear tree but doesn’t smell like a fruit tree. michael kors outlet Water is being cleared away to allow for a new dam to be put in on the west end of the lake.
    Germany (2-1-0) finished second. michael kors outlet online Lale (Günes Sensoy), Nur (Doga Doguslu), Ece (Elit Iscan), Selma (Tugba Sunguroglu) and Sonay (Ilayda Akdogan) engage in some mild capers on the way home to their small Turkish village for the summer, swimming with boys and stealing apples from a farm. l 锘?a href=http://www.michaelkors.us.org>michael kors outlet
    You have everything, and lights throughout this area. coach handbags As an example, he repeatedly has refused to offer a personal stance during his campaign on the ballot proposal to ban fracking and limit petroleum production.
    h Grade: B ray ban sunglasses outlet Jimmy Hickey, RTexarkana, cochairman of the Legislative Joint Auditing Committee. p
    “Well, most people didn’t do very much. coach bags Sheraton Grand Phoenix 2-12-2016NERDVANA: Your short story, “The Ghost That Haunts the Superstition Mountains” the 2012 Under the Moons of Mars anthology], brings John Carter and friends back to Earth during the height of the Apache Wars in the Arizona Territory. http://www.coachoutletstoreonline.me
    They were native to Michigan but gone by the turn of the 20th century. michael kors outlet online Found ‘ghostlike’ octopus, scientists say u oakley sunglasses
    Croak brings a wealth of technical and practical experience to this new area of responsibility ray ban sunglasses You’ve gone through three turns, and now this is the home stretch.
    The inspiration for many of ’s illustrations comes from observing plants and animals near her home and studio in Eugene or while abroad. The original watercolor and gouache called “Common Ravens in Winter” sold but she sells unframed reproductions, 37 inch by 21 inch, for $125. oakley sunglasses “Lawmakers can expect a robust effort by the grassroots to steer them away from expanding Medicaid and placing Arkansas on a path to fiscal ruin. s coach outlet online
    He called the after-hours club a “drug lair,” adding that “it has a bad crowd. coach outlet His choice of coloring has changed too.

    [回复]

  1. 2010年12月6日11:39 | #1
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: