繁体   English   中英

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

[英]C++ Preprocessor include and define trouble with multiple files

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

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

  • A.cpp //(包含我的主要功能)
  • BH
  • B.cpp //(不扮演角色)
  • 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仍然在Ch中定义,但Func的定义不同???

有谁能解释一下? 或者您希望我为您提供我相当复杂的解决方案或一些代码片段?

我真的迷路了:(

编辑:我使用断点来确认调用C.cpp函数,'Func'被简单地视为空白

编辑2:由于缺乏声誉,我无法回答我自己的问题,所以我把它放在这里:
我创建了一个实现我的抽象描述的新项目,它确实触发了#ifndef中的退出
因此,您无法通过此描述解决问题。 我只需要再次查看所有内容并找出错误/错误。

我的两分钱:

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

C.cpp没有引用Ah,因此它没有看到定义。 在这种情况下,UseOptionOne未在C.cpp中声明,它使用空白函数。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM