2010-07-18 68 views
0
#define cimg_use_jpeg 2 

#ifndef cimg_use_jpeg 

//code goes here 

#endif 

我真的不明白......为什么ifndef/endif之间的代码仍然可以在这里运行?

+2

请展示一个完整的c代码,证明你认为不正确,因为代码甚至不应该被编译。尝试使用'gcc -E'获取预处理器输出 – mvds 2010-07-18 14:37:51

+0

如果在#define之后有#undef,它可以。你的确切代码是什么? – Gobra 2010-07-18 14:39:29

+0

或#define周围是否有#ifdef。或几百个其他选项。但它不应该像现在这样编译。 – mvds 2010-07-18 15:27:35

回答

6

每次发生与此类似的事情(所谓不可能的事情)时,原因是:我在编辑器中看到的代码不是运行的代码。这可能发生在许多方面。

  • 忘记让
  • 忘记保存
  • 保存代码
  • 从你编译
  • 新代码跑了一个不同的环境现状运行的副本,但我打开,我看着旧的输出
+0

+1当我在调试时,我会'#if 0/*旧代码*/#else/*新代码* /#endif',这样我就可以尝试修复,但能够轻松恢复到原始状态。我有时会不小心在'/ *旧代码* /'中进行更改,认为我正在更改'/ *新代码* /',然后在重新编译时没有任何更改。 – cape1232 2010-07-18 15:03:58

+1

@ cape1232为什么不使用源代码管理?源代码控制的全部目的是让你恢复,并且它通常比你的手动版本控制更易于管理... – atk 2010-07-18 16:21:51

+0

@atk我这样做,就像cape1232,我只是想改变几分钟。然后来电话... – 2010-07-18 16:35:01

0

要么你写

#define yoursymbol 

#ifdef yoursymbol 

,或者你写

#define yoursymbol somevalue 

#if yousymbol == somevalue 

不要混合使用它们

编辑: 因为人们似乎误解了我的意思,这里是一个澄清:当你编程时,编码是非常重要的,这样其他人就能理解你的意图是什么,所以如果你的意图只是检查一个符号是否被定义了,那么指定一个数值是很困难的。

+1

-1:关闭主题,不回答问题。他不希望代码执行。 – alternative 2010-07-18 14:51:08

+0

你可以混合它们。看到我的答案(因为我不能把代码放在评论中)。 – cape1232 2010-07-18 14:58:00

+0

@mathepic只是显示原则,而不是主题。其实混合风格并不好。要么使用宏符号的值,要么只是想知道符号本身是否已被定义,但是通过混合使读者不清楚宏的意图是什么。 – 2010-07-19 01:38:58

0

这应该肯定会按照您的预期工作。假设cimg_use_jpeg按照预期定义,#ifndef/#endif块中的代码甚至不会被编译器编译。

所以问题是,cimg_use_jpeg定义为你所期望的?或者您是否简化了您的问题,并且凭借简化提供了一个实际可行的样本?

1

它无法执行。也许你运行不正确的可执行文件打印__DATE____TIME__来追踪或记录有助于检测这些错误。

+0

'__DATE__'和'__TIME__'将正确显示,如果你用反引号将它们包围。我为你解决了这个问题。 – sepp2k 2010-07-18 14:50:17

0

@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 
} 
+0

只是因为它的工作并不意味着你应该。如果你只是想看看符号是否被定义(这是我的意思是在我的文章中),那么读者就会很难理解'2'的意思。 – 2010-07-19 01:57:20

+0

是的。我应该将2改为1.这2是令人困惑的。 – cape1232 2010-07-20 01:26:10

相关问题