GCC:_Static_assert“静态Assert的非常数条件”

snz8szmq  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(126)

我有更大的C代码库,我想在那里集成一些C代码。C代码需要一些来自C代码库的声明。
编译器目前是GCC 6.3.1,但我们可以更新编译器。
基本上,包含的C头文件包含这样的代码:

#define NRF_GPIO  ((int*)          0x0000112233)
static_assert(NRF_GPIO == NRF_GPIO, "asd");

如果编译器编译C文件,这编译得很好,但如果代码是用C++编写的,则会失败,因为重新解释转换不会产生常量表达式,编译器正确地抱怨它:

error: non-constant condition for static assertion
 static_assert(NRF_GPIO == NRF_GPIO, "asd");
                        ^
t.cpp:2:20: error: reinterpret_cast from integer to pointer
 #define NRF_GPIO  ((int*)          0x0000112233)
                   ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
t.cpp:3:15: note: in expansion of macro 'NRF_GPIO'
 static_assert(NRF_GPIO == NRF_GPIO, "asd");

有没有一种方法可以让GCC更轻松地编译C++,从而排除上面的代码?

tkclm6bt

tkclm6bt1#

在C中,静态Assert需要一个 * 整型常量表达式 *,它可能包含对非整型类型的强制转换,仅作为sizeof_Alignof操作数的一部分。
C语言确实允许实现其他形式的 * 常量表达式 *,但至少在当前的C23工作草案中已经澄清了这不会影响 * 整数常量表达式 * 的有效性。参见N2713
GCC也警告了-pedantic
一般来说,你不能凭空创造指针值,并在C中的编译时使用它们(空指针值除外)。C允许稍微多一点,但在需要 * 整数常量表达式 * 的上下文中不允许。见下文。
处理这个问题的唯一方法是在编译时将地址保持为数值,并仅在运行时需要时将其转换为指针。
C中有一个例外,但不是C
:一个整数常量可以被转换为一个指针,并被用作一个 * 地址常量 * 来常量初始化一个变量。然而,即使这样,地址常量也不能是初始化表达式中==(或大多数其他运算符)的操作数,也不允许在 * 整数常量表达式 * 中使用。

相关问题