【问题标题】:scope of #undef C++#undef C++ 的范围
【发布时间】:2011-05-03 08:24:00
【问题描述】:


我有一个关于使用#undef 重新定义宏的问题。
我有一个文件global.h,其中包含许多#define-d 宏。在使用这些宏的代码中,我发现宏所持有的值不够通用。我想重新定义宏以使它们更通用。为此,我编写了以下代码 sn-p:

 std::cout << endl << "Enter pitch threshold:" << endl;  
 std::cin >> pitchT;  
 #ifdef PitchThreshold  
  #undef PitchThreshold  
  #define PitchThreshold pitchT   
  #endif  

我的问题是:
以这种方式使用#undef 是否可以确保在所有源文件中重新定义宏,或者它是编写上述代码行的函数的本地函数? #undef 和 #define 运算符的范围是什么?
我可以做什么(除了更改文件中的宏#define-d 本身)以确保在所有源文件中更改宏定义?
谢谢,
斯里拉姆

【问题讨论】:

    标签: c++ macros scope undef


    【解决方案1】:

    #ifdef 是一个预处理器指令,这意味着它将在您的源代码编译之前应用。这意味着只有“下面”的源代码会受到影响。如果您通过预处理器运行源代码,您将能够看到结果。这将使您更深入地了解预处理器的工作原理。

    【讨论】:

    • 但是#undef 运算符与重新定义它的值有什么关系吗?例如,在上面的代码 sn-p 中,pitchT 是一个 int,它是发生此重定义的函数的局部变量。当 pitchT 超出范围时,会影响 #define 语句吗?
    • 您不能在运行时更改宏的值。预处理器只进行文本替换,因此下次在您的代码中使用 PitchThreshold 时,将其替换为 pitchT(变量名,而不是其值)。
    • 这就是我一直在寻找的答案!谢谢拉尔斯曼!我认为#define 会用它的值替换 pitchT。
    【解决方案2】:

    #undef 运算符的作用域是调用后的整个文件。这包括包含它的所有文件(因为预处理器只是将文件链接在一起。)因为它是预处理器的一部分,所以它没有像范围这样的奇怪东西。

    【讨论】:

    • 但是#undef 运算符与重新定义它的值有什么关系吗?例如,在上面的代码 sn-p 中,pitchT 是一个 int,它是发生此重定义的函数的局部变量。当 pitchT 超出范围时,会影响 #define 语句吗?
    • 所有#define A B 运算符都会用B 替换A 的所有实例。您可以使用#define INFLOOP while(true){},预处理器会很乐意替换它。预处理器只是对文本执行操作,它与 C 语言完全无关。但是,在您发布的代码的上下文中,您的问题没有任何意义,因为没有任何文本被替换。 “PitchThreshold”没有出现在您的 C 代码中。
    • PitchThreshold 是在名为 global.h 的文件中定义的宏的“名称”,但在此在名为 sentence.C 的文件中重新定义。如果没有出现pitchThreshold,那是因为我没有贴出完整的代码。
    猜你喜欢
    • 2017-01-28
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2019-05-30
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多