C 使用带有枚举常量的`#ifndef`中的`#define`时出现问题
我有一个问题,移动到不同版本的API库已经重命名了其中一个常量。特别是,5.04版使用了C 使用带有枚举常量的`#ifndef`中的`#define`时出现问题,c,if-statement,enums,c-preprocessor,C,If Statement,Enums,C Preprocessor,我有一个问题,移动到不同版本的API库已经重命名了其中一个常量。特别是,5.04版使用了梯度下降学习,6.07版使用了梯度上升学习 没问题,我想。我将使用#define将旧常量设置为新常量值,然后根据它进行编译。 因此,我将其放在相关C文件的顶部: #include Netica.h #if defined(GRADIENT_DESCENT_LEARNING) /* Version 5.04 uses descent*/ #else /* Fix for label changes from
梯度下降学习
,6.07版使用了梯度上升学习
没问题,我想。我将使用#define
将旧常量设置为新常量值,然后根据它进行编译。
因此,我将其放在相关C文件的顶部:
#include Netica.h
#if defined(GRADIENT_DESCENT_LEARNING)
/* Version 5.04 uses descent*/
#else
/* Fix for label changes from version 5.04 to 6.07 */
#define GRADIENT_DESCENT_LEARNING GRADIENT_ASCENT_LEARNING
#endif
当我针对6.07代码进行编译时(使用GRADIENT\u ascend\u LEARNING
),这工作正常,但当我尝试针对早期定义的4.05库进行编译时(使用GRADIENT\u ascend\u LEARNING
),我会收到以下一系列错误消息:
Experience.c:98:19: error: use of undeclared identifier
'GRADIENT_ASCENT_LEARNING'; did you mean 'GRADIENT_DESCENT_LEARNING'?
algorithm = GRADIENT_DESCENT_LEARNING;
^~~~~~~~~~~~~~~~~~~~~~~~~
GRADIENT_DESCENT_LEARNING
Experience.c:14:36: note: expanded from macro 'GRADIENT_DESCENT_LEARNING'
#define GRADIENT_DESCENT_LEARNING GRADIENT_ASCENT_LEARNING
^
/Users/ralmond/software/Netica_API_504/src/Netica.h:149:51: note:
'GRADIENT_DESCENT_LEARNING' declared here
typedef enum {COUNTING_LEARNING=1, EM_LEARNING=3, GRADIENT_DESCENT_LEARNI...
^
中间那一行使我困惑。听起来,即使通过Netica.h
中的enum定义的梯度下降学习
,也会发生重新定义。(6.07版本使用了梯度上升学习
代替梯度下降学习
)
如何测试枚举常量是否已定义
我在MacOS下使用clang 11.0.0版(Xcode 4.2.1)时遇到了这个问题,在Windows(MinGW-w64)下使用GCC 4.9.3时出现了一个非常类似的问题(错误消息的措辞略有变化)。答案是:
枚举常量是在编译时定义的,而不是在预处理器时定义的,因此该常量始终未定义
我需要一个更好的(可能是破解第三方库中的头文件)。这是一个关闭问题并删除它的原因,而不是发布一个重复相同内容的答案。