【发布时间】:2012-08-03 16:18:52
【问题描述】:
我将抽象我的问题以避免包含不需要的细节,但如果需要,我可以提供源代码。我正在使用视觉工作室。
我有以下文件 - 所有头文件都有 #pragma 一次:
- A.cpp //(包含我的主函数)
- B.h
- B.cpp //(不扮演任何角色)
- C.h
- C.cpp
这里是预处理器命令的设置方式:
A.cpp #defines UseOptionOne
A.cpp #includes B.h
B.h #ifdef UseOptionOne
#defines Func as f1() //(calling a function that prints a msg)
#else
#defines Func as [blank]
A.cpp #includes C.h
C.h #includes B.h // (B.h have #pragma once, so it doesnt get included again)
以下是函数调用的设置方式:
A.cpp main function uses Func //- It prints as intended
A.cpp calls function in C.cpp // this function does the following:
{
#ifndef UseOptionOne
exit(0) //- Doesn't happen, so UseOptionOne is defined
#endif
uses Func //- DOES NOTHING?????
}
A.cpp uses Func //- It prints as intended
我不明白这怎么可能?确认 UseOptionOne 仍然在 C.h 中定义,但 Func 定义不同???
谁能解释一下?或者您希望我为您提供我相当复杂的解决方案或一些代码片段?
我真的迷路了:(
编辑:我使用断点来确认调用了 C.cpp 函数,'Func' 被简单地视为空白
EDIT2:由于缺乏声誉,我无法回答我自己的问题,所以我把它放在这里:
我创建了一个实现我的抽象描述的新项目,它确实触发了 #ifndef
中的退出
所以你们中的任何人都无法解决这个描述的问题。我将不得不再次查看所有内容并找到错误/错误。
【问题讨论】:
-
只是一个评论。为了代码可移植性,您可能应该使用包含保护而不是
#pragma once。 -
我也是。在你上面的代码中你说'A.cpp #defines UseOptionOne'。在下面的解释中,您说“UseOptionOne 在 C.h 中定义”。它是哪一个?也许两者兼而有之。像这样解释你的代码的问题在于,你不可避免地会弄错一些关键细节,因此没有人能够回答你的问题。最好的办法是不要给我们摘录你的代码,也不要发布你的整个程序。最好的办法是制作一个仍然存在您描述的问题的代码的迷你版本,然后发布所有这些。
-
我同意 RageD 的观点,它总是更便于携带。根据我的经验,#pragma once 声明从未创造出如此多的优势,更喜欢它而不是便携。
-
我在下面的解释中的意思是 UseOptionOne 被确认在 C.h 中定义(仍然定义)!我的坏
标签: c++ c-preprocessor