用警告在G 上编译代码,但在Clang3.1(Xcode 4.3.3)上给出了相同代码的错误

Code compiles on g++ with warning but gives error for same code on clang3.1(Xcode 4.3.3)

本文关键字:代码 错误 编译 警告 但在 Clang3 Xcode      更新时间:2023-10-16

以下行在g 上成功编译,但在clang上给出了错误::

static_assert(tBits <= sizeof(ULONG)*8, "This is IO method");

g 警告::

没有对" static_assert"参数的参数,取决于模板参数,因此必须可用'static_assert'的声明

clang错误::

使用未宣布的标识符'static_assert';您的意思是" static_cast"?

请帮助我。

函数发表的评论声明:

template < size_t tBits >
HRESULT DoIO( std::bitset< tBits >& bitsetToSerialize ) const

" static_assert"在C 11中引入了语言关键字 - 不是函数或宏。

两个编译器都给您"我不知道此功能"警告/错误。

对于编译器,当您使用" static_assert"时,编译器给您"我不知道此功能",编译器不得用C 11支持(-std = C 11)进行编译(-STD = C 11)。

为了证明这一点,我采用了以下代码:

#include <bitset>
template<size_t tBits>
int DoIO(std::bitset<tBits>& /*bitsetToSerialize*/)
{
    static_assert(tBits <= sizeof(unsigned long) * 8, "tBits is too big.");
    return tBits;
}

然后,我用GCC 4.7.3编译了它,并收到以下错误:

Osmith@olivia64〜/src $ g    -o sa.o -c sa.cppsa.cpp:在函数" int doio(std :: bitset&lt; _nb>&amp;)"中:sa.cpp:6:78:错误:" static_assert"没有参数取决于模板参数,因此必须提供" static_assert"的声明[-fpermissive]sa.cpp:6:78:注意:(如果使用" -fpermissive",g   将接受您的代码,但允许使用未确定的名称的使用)

然后,我启用了C 11支持,并没有问题编译:

OSMITH@olivia64〜/src $ g    -std = C    11 -o sa.o -c sa.cpp -wallOsmith@olivia64〜/src $

所以,然后我用clang

编译了它
Osmith@olivia64〜/src $ clang    -o sa.o -c sa.cppsa.cpp:6:9:错误:使用未确定的标识符'static_assert';您的意思是" static_cast"?        static_assert(tbit&lt; = sizeof(unsigned long) * 8," tbits太大。");        ^生成1个错误。

最后,我使用C 11支持的Clang对其进行了编译,并在其中编译了。

Osmith@olivia64〜/src $ clang- versionUbuntu Clang版本3.2-1〜exp9ubuntu1(标签/发行_32/final)(基于LLVM 3.2)目标:x86_64-pc-linux-gnu线程模型:POSIXOSMITH@olivia64〜/src $ clang    -Std = C    11 -O SA.O -C SA.CPPOsmith@olivia64〜/src $

可以肯定的是,让我们给编译器的机会来帮助我们并打开" -wall":

Osmith@olivia64〜/src $ g    -wall -o sa.o -c sa.cppsa.cpp:6:9:警告:标识符'static_assert'是C    11中的关键字[-wc    0x-compat]sa.cpp:在函数" int doio(std :: bitset&lt; _nb>&amp;)"中:sa.cpp:6:78:错误:" static_assert"没有参数取决于模板参数,因此必须提供" static_assert"的声明[-fpermissive]sa.cpp:6:78:注意:(如果使用" -fpermissive",g   将接受您的代码,但允许使用未确定的名称的使用)