有没有办法引用从未定义/声明的C常量?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法引用从未定义/声明的C常量?相关的知识,希望对你有一定的参考价值。

我认为答案是否定的,我通常不会遇到麻烦的源代码,但我对C / C ++稍微有些新意,无法找到声明此常量的位置。

我在CMD_REQ_REDIS_MGET寻找The hiredis-vip client library for Redis。我做了一个github / google搜索,并在五次出现时得到了两个文件的结果。我也尝试在源代码中grep查找字符串。

$ grep -rnw ./ -e "CMD_REQ_REDIS_MGET"
./command.c:241:    case CMD_REQ_REDIS_MGET:
./command.c:574:                    r->type = CMD_REQ_REDIS_MGET;
./hircluster.c:3257:        if (command->type == CMD_REQ_REDIS_MGET) {
./hircluster.c:3446:        if (command->type == CMD_REQ_REDIS_MGET) {
./hircluster.c:3480:    if (command->type == CMD_REQ_REDIS_MGET) {

源代码不包含任何二进制文件,应该是自包含的。它不包括任何与Redis相关的外部资源库,所以我只是困惑了几个小时。

我需要知道的原因是我正在尝试添加另一个常量,就像它一样,我一直得到错误,声明还没有找到,所以我想知道是否有任何黑魔法在这里发生C我是只是没有意识到。

编辑:想要指出这个代码实际上将按原样编译。

答案

不可能使用之前未声明的常量。但在那种情况下,常数被宣布,但不是微不足道的。

您没有在任何地方找到该字符串(它应该在头文件中),因为这些值是使用令牌粘贴在command.h的宏中定义的(##运算符通过组合旧的标识符来创建新的标识符):

#define DEFINE_ACTION(_name) CMD_##_name,
typedef enum cmd_type {
    CMD_TYPE_CODEC(DEFINE_ACTION)
} cmd_type_t;
#undef DEFINE_ACTION

所以你永远找不到CMD_ +你的后缀。然后通过一些魔术(宏名称可能在某些时候重新定义),以下定义所有元素:

#define CMD_TYPE_CODEC(ACTION)                                                                      
    ACTION( UNKNOWN )                                                                               
    ACTION( REQ_REDIS_DEL )                    /* redis commands - keys */                            
    ACTION( REQ_REDIS_EXISTS )                                                                      
    ACTION( REQ_REDIS_EXPIRE )                                                                      
    ACTION( REQ_REDIS_EXPIREAT )                                                                    
    ACTION( REQ_REDIS_PEXPIRE )                                                                     
    ACTION( REQ_REDIS_PEXPIREAT )                                                                   
    ACTION( REQ_REDIS_PERSIST )                                                                     
    ACTION( REQ_REDIS_PTTL )                                                                        
    ACTION( REQ_REDIS_SORT )                                                                        
    ACTION( REQ_REDIS_TTL )          

这些宏对于避免复制/粘贴是非常有用的,但是当你试图使用grep在代码中找到自己的方式时,它们会很糟糕。

以上是关于有没有办法引用从未定义/声明的C常量?的主要内容,如果未能解决你的问题,请参考以下文章

SQL记录-PLSQL包

C/C++经典面试题一

PL/SQL包(package)操作实例讲解

nvcc:结合外部和常量

有没有办法在声明 angular2 数据模型时在 typescript 中引用数据类型

KotlinKotlin 变量与常量 ( 变量声明 | 只读变量 | 类型推断 | 编译时常量 | Kotlin 字节码查看面板 | Kotlin 引用数据类型 )