- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
是否可以让编译器错误/警告诊断输出 C11 或 C17 中的编译时计算数值(即不使用模板)?下面的链接使用模板魔术在 C++ 中执行此操作。目的是将其用作 _Static_assert 替换,它打印不等于失败表达式的值。理想情况下,它应该能够将表达式评估为真或假,并仅在评估失败时打印。
这显然依赖于编译器,因此假设 GCC。
最佳答案
让 GCC 做到这一点出奇地困难。我找到了这个答案:https://stackoverflow.com/a/35261673/502399这表明是这样的:
void error() {
int array[sizeof(struct X)];
__builtin_printf("%d", &array);
}
输出类似
foo.c: In function ‘error’:
foo.c:8:21: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int (*)[8]’ [-Wformat=]
__builtin_printf("%d", &array);
~^ ~~~~~~
只要你能传递 -Wformat 或 -Wall 之类的。
为了查看是否有更简单的方法,我搜索了该消息的 GCC 源代码,发现参数类型是用特殊的 GCC 特定 %qT
格式字符串打印的,所以我寻找其他该字符串的用途。具体来说,我正在寻找它在错误中的使用,而不是警告,这样它就可以在不考虑警告标志的情况下工作。我在 binary_op_error()
中找到了一个用法,我从中制作了这个示例:
int array[sizeof(struct X)];
int error = 1 / &array;
产生
foo.c:7:15: error: invalid operands to binary / (have ‘int’ and ‘int (*)[8]’)
int error = 1 / &array;
^ ~~~~~~
其他可能性包括
int array[sizeof(struct X)];
int error = __sync_fetch_and_add(&array, 1);
和
int error = _Generic((int (*)[sizeof(struct X)])0, int: 0);
和
int foo(double bar);
int error = foo((int (*)[sizeof(struct X)])0);
等等
关于c - _Static_assert 替换以在 C 中显示值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53310844/
最终,我想要一个编译时常量宏,它本身包含一个断言。 使用真正的_Static_assert,我可以做类似的事情 #define CEXPR_MACRO_WITH_ASSERTION(Assertion
我想制作宏,检查文件是否“可包含”。像这样: #define CHECK(__file) \ _Static_assert( __has_include(__file), "Error"
是否可以让编译器错误/警告诊断输出 C11 或 C17 中的编译时计算数值(即不使用模板)?下面的链接使用模板魔术在 C++ 中执行此操作。目的是将其用作 _Static_assert 替换,它打印不
我希望在a_static_assert中使用文字的数组文字,但我收到编译器错误,指出这不是常量表达式。有没有办法让它发挥作用?
在C11中这样写是合法的,例如: int b = (some_function_returning_void(), 1020); 你会得到 1020。但它不会让你写: int b = (_Static
假设我有以下定义: #include #include #define ASSERT(cond) _Static_assert(cond, #cond) typedef union { s
我明白人们会使用 C11 的“泛型”做什么,我想在静态断言中使用它来保证两个用户定义类型 (typedef) 是相同的原始类型。 我制作了一个宏,将每个原始类型映射到一个枚举值,并验证它是否按预期工作
例如,在C11中,可以合法地写:。你会得到1020美元。但它不会让你写下:。GCC返回。有时在表达式之外使用_STATIC_ASSERT会很不方便,因为您不太可能使用基于预处理器宏的伪函数来验证它们的
减少到最简单的可复制大小: #include #ifdef static_assert static_assert(1 == 1, "oops!"); #endif 用 -std=c99 -peda
我是一名优秀的程序员,十分优秀!