让 C 在 _Generic 中生成错误
Have C generate an error inside a _Generic
我一直在研究一些代码(与线性代数相关)。我有多种类型,应该能够相互相乘。
自然而然地想到了"let's use _Generic"。只要参数类型的组合有效,它就可以工作。根据搜索引擎,一些库已诉诸于在虚拟函数上使用属性来生成错误:
#include "stdio.h"
// Example struct.
typedef struct mat3_s
{
float m[9];
} mat3;
// Dummy function.
mat3 mult(mat3 const *A, mat3 const *B)
{
return *A;
}
mat3 mults(mat3 const *A, float const *B)
{
return *A;
}
typedef mat3 (*dummyptr)(void *A, void *B);
extern dummyptr INCOMPATIBLE_TYPES() __attribute__((error("Crikey")));
#define LMULT(A, B)\
_Generic((A),\
mat3: \
_Generic((B),\
mat3: mult, \
float: mults, \
default: INCOMPATIBLE_TYPES()),\
default: INCOMPATIBLE_TYPES()) (&(A), &(B))
int main(int argc, char *argv[])
{
mat3 a = {{0}};
mat3 b = {{0}};
mat3 c = LMULT(a, b);
mat3 d = LMULT(a, "not kosher");
// Inhibit GCC from optimising away above variables.
printf("%p %p %p %p\n", &a, &b, &c, &d);
return 0;
}
涉及的体操是"INCOMPATIBLE_TYPES"函数。就目前而言,它不能很好地工作(如果有的话)。而且它仅适用于 GCC,而且很脆弱,而且...只是不太好。
_Pragma("gcc error \"Great heavens\"")
也不会工作,因为 GCC 将 _Pragma
扩展为生成的宏。这恰好在 _Generic
-expression 内部,当然会在稍后阶段处理。
我准备放弃,只是给出乱码(也称为 C++ 错误报告),希望它能提供足够的信息来说明可能是什么问题。
如果传递了两种没有相应功能的类型,是否还有其他人知道如何生成足够用户友好的消息?
至少对于您的示例,解决方案非常简单,省去了 default
部分。然后编译器将产生类型不匹配的错误。
我一直在研究一些代码(与线性代数相关)。我有多种类型,应该能够相互相乘。
自然而然地想到了"let's use _Generic"。只要参数类型的组合有效,它就可以工作。根据搜索引擎,一些库已诉诸于在虚拟函数上使用属性来生成错误:
#include "stdio.h"
// Example struct.
typedef struct mat3_s
{
float m[9];
} mat3;
// Dummy function.
mat3 mult(mat3 const *A, mat3 const *B)
{
return *A;
}
mat3 mults(mat3 const *A, float const *B)
{
return *A;
}
typedef mat3 (*dummyptr)(void *A, void *B);
extern dummyptr INCOMPATIBLE_TYPES() __attribute__((error("Crikey")));
#define LMULT(A, B)\
_Generic((A),\
mat3: \
_Generic((B),\
mat3: mult, \
float: mults, \
default: INCOMPATIBLE_TYPES()),\
default: INCOMPATIBLE_TYPES()) (&(A), &(B))
int main(int argc, char *argv[])
{
mat3 a = {{0}};
mat3 b = {{0}};
mat3 c = LMULT(a, b);
mat3 d = LMULT(a, "not kosher");
// Inhibit GCC from optimising away above variables.
printf("%p %p %p %p\n", &a, &b, &c, &d);
return 0;
}
涉及的体操是"INCOMPATIBLE_TYPES"函数。就目前而言,它不能很好地工作(如果有的话)。而且它仅适用于 GCC,而且很脆弱,而且...只是不太好。
_Pragma("gcc error \"Great heavens\"")
也不会工作,因为 GCC 将 _Pragma
扩展为生成的宏。这恰好在 _Generic
-expression 内部,当然会在稍后阶段处理。
我准备放弃,只是给出乱码(也称为 C++ 错误报告),希望它能提供足够的信息来说明可能是什么问题。
如果传递了两种没有相应功能的类型,是否还有其他人知道如何生成足够用户友好的消息?
至少对于您的示例,解决方案非常简单,省去了 default
部分。然后编译器将产生类型不匹配的错误。