【发布时间】:2021-05-26 20:38:25
【问题描述】:
我必须将纯 C .h 文件集成到我的 C++ 项目(Qt GUI)中。为此,我必须避免一些带有棘手替换的函数指针。您可以在下面看到的一段代码之前在 MinGW 5.3.0 C++ 中编译时没有任何问题。但是当我尝试使用更新鲜的编译器(C++ 为 7.3.0)时,我收到一个错误“从 'int' 到 'void ()(void)' 的无效转换”,但它仍然可以毫无问题地编译与 C 相同的 7.3.0。
void func_to_avoid( void* );
void func_to_avoid2( void* );
#ifdef MY_PART
#define SOME_MACROS( func ) 0
#define SOME_MACROS2( func ) 0
#endif
typedef struct
{
#ifdef MY_PART
void (*func)(void*);
#else
AvoidedFunction_t func;
#endif
}type_descr_t;
const type_descr_t types[]
={
//...
{
// SOME_MACROS( func_to_avoid ) // this expression compiles without any problem
SOME_MACROS( func_to_avoid ) + SOME_MACROS2( func_to_avoid2 ) // **compilation error!**
}
//...
};
问题: 编译器给我带有“+”的宏表达式的错误。如何解决?
我认为这是一个铸造问题,但我自己无法解决。当然,我总是可以返回到以前的编译器版本或使用另一个编译器(例如,msvc),但它看起来根本不像一个解决方案。 是否有任何转换解决方案来解决此编译问题?
更新:下面的代码允许重现错误。正如我所说,它正在使用 C 编译器和 5.3.0 MinGW C++。
main.c
void func_to_avoid( void* );
void func_to_avoid2( void* );
#define MY_PART
#ifdef MY_PART
#define SOME_MACROS( func ) 0
#define SOME_MACROS2( func ) 0
#endif
typedef struct
{
#ifdef MY_PART
void (*func)(void*);
#else
AvoidedFunction_t func;
#endif
}type_descr_t;
const type_descr_t types[]
={
{
SOME_MACROS( func_to_avoid )+SOME_MACROS2( func_to_avoid2 )
}};
int main()
{
return 0;
}
【问题讨论】:
-
请提供minimal reproducible example。
MY_PART定义了吗?如果没有定义怎么办?然后SOME_MACROS将导致如下错误:godbolt.org/z/Mse9n8 -
我不完全理解,但你的问题归结为
int* x = 0;vsint* x = 0+0;,后者被拒绝并出现同样的错误。为什么要首先添加函数指针? -
如果您使用 GCC 或 Clang,请尝试启用
-E标志以查看宏是如何扩展的。 -
你想用
+构造来实现什么?不应该是{SOME_MACROS( func_to_avoid )}, {SOME_MACROS2( func_to_avoid2 )}吗? -
“模拟”不需要的函数不是解决这个问题的更聪明的方法吗?即:
void dummy_scanf (const char*s,...){}然后#define scanf dummy_scanf。这应该编译为无操作。
标签: c++ c compiler-errors mingw