gpt4 book ai didi

c - _Static_assert 替换以在 C 中显示值

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:49 26 4
gpt4 key购买 nike

是否可以让编译器错误/警告诊断输出 C11 或 C17 中的编译时计算数值(即不使用模板)?下面的链接使用模板魔术在 C++ 中执行此操作。目的是将其用作 _Static_assert 替换,它打印不等于失败表达式的值。理想情况下,它应该能够将表达式评估为真或假,并仅在评估失败时打印。

这显然依赖于编译器,因此假设 GCC。

Display integer at compile time in static_assert()

最佳答案

让 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com