在Visual Studio中使用括号时编译错误,但在G ++ / CLang ++中传递
compile error when using parenthesis in visual studio but pass in g++/clang++
我正在开发跨平台项目,我发现了一些奇怪的东西。 在 Visual Studio 中,以下代码将失败。但是 Linux 环境中的 g++/clang++ 可以编译而不会出错。此外,我在VS上搜索关键字,但一无所获。有人知道吗?
int main(){
({;});
return 0;
}
error C2059: syntax error: '{'
error C2143: syntax error: missing ';' before '{'
error C2059: syntax error: ')'
Visual Studio 版本我有:Microsoft Visual Studio Professional 2019,版本 16.5.1
在Visual Studio中,它被解释为vc++。在 c++ 中, ;标记语句结束。所以你的代码 ({;});被编译器精确地取为 1 ({; 和 2 }(;作为一个在逻辑上不正确的陈述。检查 c++ 中编写代码的语法。我不知道 g++/clang。对不起。
使用我们看到的-pedantic -Werror
标志编译clang++
dummy.cc:2:4: error: use of GNU statement expression extension [-Werror,-Wgnu-statement-expression]
({;});
^
1 error generated.
MSVC编译器(cl
,通常由Visual Studio使用(不支持许多特定于GCC的非标准扩展,包括其语句表达式。
在这种情况下,块{;}
被视为(无用的(语句表达式:
{
/* nothing */
;
/* nothing */
}
最外面的括号((
...)
(是为了确保解析器将块视为表达式,而不是更典型的空代码块。
相关文章:
- 在Visual Studio中使用括号时编译错误,但在G ++ / CLang ++中传递
- 无法在clang Linux中分配非静态成员函数,但我可以在Visual Studio Windows中分配
- 带有引用的std::tuple在clang中编译失败,但在gcc中编译失败
- enable_if is_same constexpr函数使MSVC失败(但在Clang,GCC中效果很好)
- 从std::map派生的类不在Visual C++上编译(但在gcc和clang上编译)
- constexpr(但不是真正的)构造函数在GCC中编译,而不是在Clang中编译
- GCC/Clang上的模板错误,但在MSVC上没有错误
- 成员函数模板不会在 clang 上编译,但在 GCC 上编译
- 在 gcc 4.4 上"pure virtual function called",但在较新版本或 clang 3.4 上不
- GCC 中的编译器错误,但在将 decltype 与具有尾随返回类型语法的模板化成员函数一起使用时没有 clang
- 为什么这个取消注释的宏在 clang 中无效,但在 msvc 中有效
- 构造函数上的SFINAE在VC2017中工作,但在clang / gcc中不起作用
- 获取<string>变体在 CLang++ 下失败,但 G++ 下失败
- 变量args SFINAE默认构造函数在clang中工作,但在Visual Studio 2015中失败
- AFAIK,下面的代码不应该编译,但它可以在 clang 和 GCC 中编译。我在这里错过了什么?
- Clang vs GCC - 可变参数模板参数包后跟默认值参数在 GCC 4.8 中有效,但在 Clang 3.5 中无
- CLANG与GNU编译器集合-在GNU中编译,但在CLANG中失败
- 为什么这个模板 constexpr 函数不能在 gcc 上编译,但在 clang 上效果很好?
- 依赖模板可以在Visual Studio中编译,但在clang/gcc中失败
- 类型类方法的参数的推导(const限定符重载)在gcc中失败,但在clang中没有