如何让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

如何修复不兼容的块指针类型发送错误?

CUDA-capability和CUDA版本:兼容?

如何让el-tree的节点目录不动

如何修复错误不兼容的数据类型组合 [SQL State=42562, DB Errorcode=-5562]

如何修复:“错误 fsevents@2.0.7:平台“linux”与此模块不兼容。”