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