#define cimg_use_jpeg 2
#ifndef cimg_use_jpeg
//code goes here
#endif
我真的不明白......为什么ifndef/endif之间的代码仍然可以在这里运行?
#define cimg_use_jpeg 2
#ifndef cimg_use_jpeg
//code goes here
#endif
我真的不明白......为什么ifndef/endif之间的代码仍然可以在这里运行?
每次发生与此类似的事情(所谓不可能的事情)时,原因是:我在编辑器中看到的代码不是运行的代码。这可能发生在许多方面。
+1当我在调试时,我会'#if 0/*旧代码*/#else/*新代码* /#endif',这样我就可以尝试修复,但能够轻松恢复到原始状态。我有时会不小心在'/ *旧代码* /'中进行更改,认为我正在更改'/ *新代码* /',然后在重新编译时没有任何更改。 – cape1232 2010-07-18 15:03:58
@ cape1232为什么不使用源代码管理?源代码控制的全部目的是让你恢复,并且它通常比你的手动版本控制更易于管理... – atk 2010-07-18 16:21:51
@atk我这样做,就像cape1232,我只是想改变几分钟。然后来电话... – 2010-07-18 16:35:01
要么你写
#define yoursymbol
#ifdef yoursymbol
,或者你写
#define yoursymbol somevalue
#if yousymbol == somevalue
不要混合使用它们
编辑: 因为人们似乎误解了我的意思,这里是一个澄清:当你编程时,编码是非常重要的,这样其他人就能理解你的意图是什么,所以如果你的意图只是检查一个符号是否被定义了,那么指定一个数值是很困难的。
-1:关闭主题,不回答问题。他不希望代码执行。 – alternative 2010-07-18 14:51:08
你可以混合它们。看到我的答案(因为我不能把代码放在评论中)。 – cape1232 2010-07-18 14:58:00
@mathepic只是显示原则,而不是主题。其实混合风格并不好。要么使用宏符号的值,要么只是想知道符号本身是否已被定义,但是通过混合使读者不清楚宏的意图是什么。 – 2010-07-19 01:38:58
这应该肯定会按照您的预期工作。假设cimg_use_jpeg
按照预期定义,#ifndef/#endif
块中的代码甚至不会被编译器编译。
所以问题是,cimg_use_jpeg
定义为你所期望的?或者您是否简化了您的问题,并且凭借简化提供了一个实际可行的样本?
它无法执行。也许你运行不正确的可执行文件打印__DATE__
和__TIME__
来追踪或记录有助于检测这些错误。
'__DATE__'和'__TIME__'将正确显示,如果你用反引号将它们包围。我为你解决了这个问题。 – sepp2k 2010-07-18 14:50:17
@Anders K.这工作,即适当的东西没有执行。代码产生“BAZ is undefined”
#define FOO 2
#define BAR
int main(int argc, char* argv[])
{
#ifndef FOO
std::cout << "FOO is undefined" << std::endl;
#endif
#ifndef BAR
std::cout << "BAR is undefined" << std::endl;
#endif
#ifndef BAZ
std::cout << "BAZ is undefined" << std::endl;
#endif
}
只是因为它的工作并不意味着你应该。如果你只是想看看符号是否被定义(这是我的意思是在我的文章中),那么读者就会很难理解'2'的意思。 – 2010-07-19 01:57:20
是的。我应该将2改为1.这2是令人困惑的。 – cape1232 2010-07-20 01:26:10
请展示一个完整的c代码,证明你认为不正确,因为代码甚至不应该被编译。尝试使用'gcc -E'获取预处理器输出 – mvds 2010-07-18 14:37:51
如果在#define之后有#undef,它可以。你的确切代码是什么? – Gobra 2010-07-18 14:39:29
或#define周围是否有#ifdef。或几百个其他选项。但它不应该像现在这样编译。 – mvds 2010-07-18 15:27:35