【发布时间】:2013-06-06 12:49:31
【问题描述】:
我有一个用 C 编写的程序。原来的 makefile 有“gnu99”。 Clang 编译它没有额外的命令行选项。但是,如果我包含一个用 c++11 编写的仅头文件库(可变参数模板 => 无法单独编译),那么地狱就会崩溃......
简单地使用 'clang inputfile.c staticlib.a -lsomelib' 编译会出现如下错误:
error: unknown type name 'namespace'
error: unknown type name 'template'
... much much more ...
所以它会尝试将 c++ 编译为纯 c
如果我尝试 'clang++ -std=c++11 -stdlib=libc++ inputfile.c staticlib.a -lsomelib',那么:
error: expected ';' after enum
error: cannot initialize a variable of type 'rssFeedState *' with an lvalue of type 'void *'
... much much more ... !!!!! I want to make it ignore these !!!!
重写 .c 文件以编译为 c++ 是最后的选择
如何让 clang 正确处理这种情况?
即:将 .c 文件编译为 c,但将包含的头文件之一处理为 c++11(实例化可变参数模板、识别名称空间、c++11 标准库……)
【问题讨论】:
-
您不能只专门“处理其中一个包含” - 标头(通过
#include)被逐字复制到包含文件中。您需要将该文件编译为-std=c++11。 -
显然至少有 1+4 人不知道解决方案
-
那么我应该重新提出这个问题:如何让它吞下那些普通的旧 c 语句?例如:typedef enum {bla foo} xyz;
-
"如何让 clang 正确处理这种情况?" -- 处理这个不是 Clang 的工作。要么你写 C,要么你写 C++。另请注意,Clang 可能是最严格的编译器。
标签: c c++11 compilation clang compatibility