【问题标题】:Is there a way to check for non-numeric value of a macro有没有办法检查宏的非数字值
【发布时间】:2016-01-05 02:10:03
【问题描述】:

假设我有

#define Name Joe

有没有办法区分宏的不同值。以下不起作用,但你明白了

#if   Name==Joe
// some code
#elif Name==Ben
// some alternative code
#endif

我想用它从同一个源代码生成各种目标文件。来源差异很小,因此可以很容易地进行宏观控制。宏将通过-DName=Joe 编译器标志传递。另请注意,Name 将是一个实际的符号名称,因此我们不能使用基于 #define Joe 1 等的技巧。


强制编辑请注意,this similar question 实际上处理的是字符串值宏。此外,那里的答案没有帮助。接受的答案避免了问题(但没有解决),另一个答案在宏中使用strcmp,它依赖于扩展等。

【问题讨论】:

  • 你可能不想要那个(XY 问题)
  • 而不是用值定义名称为什么不只是#define Joe 然后你可以检查Joe 是否存在#if defined(Joe)
  • 数字:是的。名称:没那么多。
  • how to compare string in C conditional preprocessor-directives 的可能重复项(尽管该问题仅与 C 有关)
  • @PCLuddite -- 根本不是重复的;如果您正在处理字符串,这种问题会更棘手,但在这种情况下不会太难。

标签: macros c-preprocessor preprocessor-directive


【解决方案1】:

是的,有可能,但不是那么漂亮。

这是一个例子;更改名称,它将打印正确的内容。您只需要提前为每个名称定义TEST_FOR_Name,并赋予每个名称一个唯一的值。

#define TEST_FOR_Joe 1
#define TEST_FOR_Ben 2
#define DO_TEST(NAME1, NAME2) DO_TEST_impl(NAME1, NAME2)
#define DO_TEST_impl(NAME1, NAME2) TEST_FOR_ ## NAME1 == TEST_FOR_ ## NAME2

#define NAME Ben

#include <iostream>

int main() {
  std::cout << "Hello!" << std::endl;
#if DO_TEST(NAME, Joe)
  std::cout << "Joe Found!" << std::endl;
#elif DO_TEST(NAME, Ben)
  std::cout << "Ben Found!" << std::endl;
#else
  std::cout << "Neither found!" << std::endl;
#endif
}

基本思想是我们构建具有与每个名称相关联的唯一数值的令牌。如果找不到令牌的值,则比较只会失败,否则会确保数字相同。

【讨论】:

  • @sergej:想象一下如果JoeBen 是类型:NAME var = {3};。如果#define NAME Joe 则不起作用
  • @sergej:您假设JoeBen 可以定义为任意数字。如果这些符号是有意义的,或者已经是宏,那么您更简单的方法将不起作用。 Charles 的方法不管用。
  • 这仍然适用于通过编译器选项-DName=Joe定义的宏名称吗​​?
  • @undur_gongor 你完全正确!我错过了从NameNAME 的变化。
【解决方案2】:

很确定你会发现你不能只在 C++ 中找到人们发现的工具链扩展的一些方法,但它不是可移植的。 另一个用户问类似的问题:Here

【讨论】:

  • 我也没有,但是链接问题的未接受答案中的“工具链扩展”是一种幻想。请参阅该答案的第三条评论以获取解释。
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 2021-04-19
相关资源
最近更新 更多