C ++预处理器包含并定义多个文件的故障

时间:2012-08-03 16:18:53

标签: c++ c-preprocessor

我将抽象我的问题以避免包含不需要的细节,但如果需要我可以提供源代码。我正在使用visual studio。

我有以下文件 - 所有头文件都有#pragma once:

  • 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中的退出 因此,您无法通过此描述解决问题。我只需要再次查看所有内容并找出错误/错误。

1 个答案:

答案 0 :(得分:2)

我的两分钱:

UseOptionsOne仅为A.cpp和包含A.h的类定义:在您的情况下,它仅在A.cpp中定义

C.cpp没有引用A.h,所以它没有看到定义。在这种情况下,UseOptionOne未在C.cpp中声明, 它使用空白功能。

当你离开C.cpp的范围,并返回A.cpp的范围时,该函数可以工作,因为在该范围内 已定义UseOptionOne。

如果要在所有文件中使用define,可以创建一个单独的definitions.h标头并放入其中 定义,然后将该文件包含在您希望定义工作的所有标头中。