如何让clang忽略c-c++不兼容错误?
Posted
技术标签:
【中文标题】如何让clang忽略c-c++不兼容错误?【英文标题】:How to make clang ignore c-c++ incompatibility errors? 【发布时间】: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 可能是最严格的编译器。
【参考方案1】:
完全不可能。包含 C++ 标头的唯一方法是编写 C++ 代码。所以 only 选项是将你的 C 源代码重写为有效的 C++。对于大多数 C 来说,这并不是什么大问题。
【讨论】:
不存在许可或兼容模式,所以 void* 分配和经典 typedef 不是错误吗? 我的意思是,为什么它可以让“错误:无法使用'void *'类型的左值初始化'rssFeedState *'类型的变量”作为c编译器而不是作为c++传递跨度> @user1358:因为标准是这样说的? C++ 有充分的理由从void*
中删除隐式转换 - 强制转换。
我希望有一些 -permissive 标志可以让我忽略它,顺便说一句:默认情况下,没有一个编译器完全符合标准
@user1358:-permissive 和完全改变语言之间存在巨大差异。以上是关于如何让clang忽略c-c++不兼容错误?的主要内容,如果未能解决你的问题,请参考以下文章
从命令行使用 clang 编译:兼容性问题 mac os X