【问题标题】:Is there an elegant solution for checking whether a preprocessor symbol is defined or not是否有一个优雅的解决方案来检查是否定义了预处理器符号
【发布时间】:2018-11-06 11:27:32
【问题描述】:

由于预处理器在检查未实际定义的预处理器符号的值时不会报告错误(通常是由于缺少#include“some_header.h”),所以我使用这种繁琐的三行构造和“定义” :

#if !defined(SOME_SYMBOL)
#error "some symbol isn't defined"
#endif
#if SOME_SYMBOL == 1
// Here is my conditionally compiled code
#endif

和“#ifndef”的方式是一样的。
有没有更优雅的方式来执行此检查?

【问题讨论】:

  • 不,那和#ifndef 是检查是否定义了宏的唯一方法。
  • 视情况而定。 this Q&A 您可能会觉得适用。
  • @StoryTeller 所以那里是这些赞成票的来源;) -- @OP: SOME_SYMBOL 总是定义为整数吗?
  • 顺便说一句,如果SOME_SYMBOL 未定义#if SOME_SYMBOL == 1 将评估为假。此上下文中未定义的符号被视为 0。

标签: c++ c-preprocessor


【解决方案1】:

在您的构造中,您可以使用 else 块来跳过对已定义的检查:

#if SOME_SYMBOL == 1
// Here is my conditionally compiled code
#else
// error
#endif

但原则上,cmets 是正确的。 #if !defined 和简写 #ifndef 是两个可用的版本。

目前,您正在检查 SOME_SYMBOL 是否等于 1。您是否根据该值执行不同的代码? 如果没有,您可以简单地使用:

#ifdef SOME_SYMBOL
// Here is my conditionally compiled code
#else
// error
#endif

现在这是典型的 c++ include guards 的一小步。从该维基百科链接复制,这是一个grandparent.h 文件:

#ifndef GRANDPARENT_H
#define GRANDPARENT_H

struct foo {
    int member;
};

#endif /* GRANDPARENT_H */

现在,即使您最终包含此标头两次,它也只会执行一次。

【讨论】:

  • SOME_SYMBOL 不仅可以定义为 1。其他一些值也有效。
猜你喜欢
  • 2015-07-03
  • 1970-01-01
  • 2013-06-18
  • 2011-06-03
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
相关资源
最近更新 更多