Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否可以使用预处理器指令验证表达式?比如#if(a==b)_C_C Preprocessor - Fatal编程技术网

C 是否可以使用预处理器指令验证表达式?比如#if(a==b)

C 是否可以使用预处理器指令验证表达式?比如#if(a==b),c,c-preprocessor,C,C Preprocessor,准确地说,我需要对照空指针检查函数指针。只有当函数指针映射到有效函数而不是空指针时,我才需要编译代码的一部分。在c语言中可能吗 类似于: #if (function_pointer != NULLpointer) { // Code block to be compiled } 据我所知,由于概念上的原因,这是不可能的,因为草图条件只能在运行时进行评估,而包含和排除代码的决定必须在编译时进行。您不能。这是一个运行时评估。因此,逻辑是: if (function_pointer != NULL)

准确地说,我需要对照空指针检查函数指针。只有当函数指针映射到有效函数而不是空指针时,我才需要编译代码的一部分。在c语言中可能吗

类似于:

#if (function_pointer != NULLpointer)
{
// Code block to be compiled
}

据我所知,由于概念上的原因,这是不可能的,因为草图条件只能在运行时进行评估,而包含和排除代码的决定必须在编译时进行。

您不能。这是一个运行时评估。因此,逻辑是:

if (function_pointer != NULL)
{
   // Code block to be executed
}

你必须这样做:

#define mapped // compiler switch, comment-out if function_pointer shouldn't be used

#ifdef mapped
  type function_pointer = something;
#else
  type function_pointer = NULL;
#endif

...

#ifdef mapped
  /* code to compile here */
#endif

编译和运行过程中有几个步骤。完整的列表有点让人望而生畏,但它看起来是这样的

  • 预处理
  • 汇编
  • 连接
  • 运行
  • 它们是按顺序执行的。由于没有时间旅行,后一步不能影响前一步


    因此,预处理无法使用函数指针值,因为函数指针值在程序运行之前不存在。预处理器只能根据预处理时可用的值做出决策。所有这些值都是整数。它们都必须是文字、由文字组成的表达式,或者是一些定义这些文字的东西。

    这取决于您正在检查的函数指针的性质。如果函数指针在程序运行时发生变化,则无法在编译时检查其值

    但是,如果函数指针是在编译时定义的,并且从未更改,则可以将其声明为
    const
    变量。常量表达式可以在预处理器条件下使用,因此这样的代码是合法的:

    const int *a = NULL;               
    
    int main(int argc, char *argv[]) { 
    #if a == 0                         
      printf("null\n");                
    #else                              
      printf("not null\n");            
    #endif                             
      return 0;                        
    }       
    
    由此生成的汇编代码将与以下生成的汇编代码等效:

    const int *a = NULL;               
    
    int main(int argc, char *argv[]) {                
      printf("null\n");                 
      return 0;                        
    }                            
    

    编辑:@serge是对的:这只是巧合。如果编译器可以优化掉条件的不可到达分支,那么通过将函数指针设为常量,您仍然可以获得一些收益,但这与使用预处理器条件删除代码不同。

    感觉这可能是一个XY问题。能否显示分配函数指针的代码?预处理器如何知道函数指针是否已映射?您可以使用
    #定义函数u以使用
    作为您的函数,而不是使用函数指针,然后执行
    #ifndef function以使用
    您希望预处理器知道代码将如何执行。你要求太多了。可怜的小文本替换引擎甚至不知道代码是什么。很可能C预处理器会认为
    function\u pointer
    NULLpointer
    都是零(整数零),因此它们是“相同的值”。函数地址最早要到链接时才能知道——这是预处理阶段编译过程的另一端。这是错误的。它之所以有效,是因为标准将未定义的宏
    a
    解释为
    0