#define指令在main()函数外部不起作用

时间:2015-05-24 12:41:10

标签: c++ directive

我今天刚开始学习C ++。凭借以前在其他语言方面的知识,我目前做得很好,但我对#define指令感到困惑。

我在我的"评论" C ++文件:

#include <iostream>

#define TEST     //object-like macro

#ifdef TEST      //if TEST is defined
    std::cout << "This works!" << std::endl;
#endif

#ifndef NOT_TEST //if NOT_TEST is NOT defined
    std::wcout << "This also works!" << std::endl;
#endif

int main()
{
    //program code
}

上面的代码会产生错误,首先是syntax error : mssing ';' before '<<'。当我将#define / #if指令移动到主循环中时,它可以正常工作:

#include <iostream>

int main()
{
    #define TEST     //object-like macro

    #ifdef TEST      //if TEST is defined
        std::cout << "This works!" << std::endl;
    #endif

    #ifndef NOT_TEST //if NOT_TEST is NOT defined
        std::wcout << "This also works!" << std::endl;
    #endif
}

第一块代码不正确?基于我正在使用的教程,我认为这应该是如何格式化的?

编辑:我已将代码更新为更清晰。

3 个答案:

答案 0 :(得分:3)

您应该了解编译C ++程序的过程分为两步。首先执行preproccessor,根据您给出的指令(以format shortg c = clock; fix(c); a=num2str(c); year=strcat(a(1),a(2),a(3),a(4),a(5)); month=strcat(a(19),a(20)); day=strcat(a(34),a(35)); hour=strcat(a(48),a(49)); min=strcat(a(63),a(64)); sec=strcat(a(74),a(75)); name=strcat(year,'-',month,'-',day,'-',hour,'-',min,'-',sec); wavwrite(y,44100,name); y=[]; 开头的那些指令)转换文件。然后在生成的文件上执行C ++编译器。

这里的“与预处理程序相关的代码”只是# / #ifdef(紧随其后的条件)和#ifndef个关键字,实际上,你可以把那些无论你喜欢什么,因为预处理器不关心C ++语法,它会执行简单的字符串操作。

当预处理器运行时,它会将#endif#ifdef之间的C ++代码插入到文件中,因此效果与您只有#endif行(在cout << …之外的效果相同{1}}功能)。

因此,由于main已定义且TEST未定义,因此在预处理器完成其工作后,您将获得一个只有两行的文件:

NOT_TEST

如果你尝试编译它,你会发现编译器不满意,因为那显然不是一个有效的C ++程序。

答案 1 :(得分:3)

这与格式化无关。实际上,C ++文件与格式无关。问题是,在预处理器解析您的文件后,您最终会在cout函数之外发出2 main个语句。在C ++中,除了声明/定义之外,您不能在函数外部使用独立语句。

答案 2 :(得分:1)

问题是使用cout <<的主要功能。 如果您想要任何输出行,可以使用#error指令中止编译过程。