我今天刚开始学习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
}
第一块代码不正确?基于我正在使用的教程,我认为这应该是如何格式化的?
编辑:我已将代码更新为更清晰。答案 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
指令中止编译过程。