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