【发布时间】:2021-03-23 00:50:22
【问题描述】:
这是一个巨大项目的一部分,所以我从一个cc文件中摘录了一段(实际代码中只需要一个static_assert,我只是试验了一下):
namespace large
{
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported."); // A
namespace fake_n
{
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported."); // B
}
class fake_c
{
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported."); // C
};
void fake_f()
{
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported."); // D
}
} // namespace large
gcc9报如下错误(对应A、B、C、D情况):
A,B : error: expected constructor, destructor, or type conversion before '(' token
C : error: expected identifier before 'sizeof'
: error: expected ',' or '...' before 'sizeof'
: error: ISO C++ forbids declaration of '_Static_assert' with no type [-fpermissive]
D : error: '_Static_assert' was not declared in this scope; did you mean 'static_assert'?
最后一个错误让我认为问题在于以某种方式包含了
问题:
- 案例 A、B、C 中的错误是什么意思?
- 最重要的是:在一般情况下如何处理混合 C 和 C++ 文件?
如果我无法删除(甚至找不到)相应的
怎么办?如何告诉编译器使用 C++ 版本的 static_assert,而不是 C 宏?
谢谢!
【问题讨论】:
-
有问题的 C 版本在哪里?这都是纯 C++ 代码。如果您包含
<assert.h>,您可能会遇到麻烦。 -
@tadman 我指的是
中的 C 宏 "static_assert",请参阅 en.cppreference.com/w/c/language/_Static_assert -
似乎在这里工作正常:godbolt.org/z/Ys5oqYG96。也许您的系统标头有问题?什么操作系统和版本?如果您仅
#include <assert.h>会失败,还是 MRE 需要其他东西? -
Ubuntu 上的
<assert.h>将#define static_assert _Static_assert包裹在#if !defined __cplusplus中,所以没有问题。如果你的没有,那么它可能会损坏。 -
无论如何,这也表明在您的
#includes 之后的#undef static_assert可能是一个简单的解决方法。
标签: c++ c static-assert