gpt4 book ai didi

C++ 预处理器包含和定义多个文件的问题

转载 作者:行者123 更新时间:2023-11-28 03:33:39 24 4
gpt4 key购买 nike

我将抽象我的问题以避免包含不需要的细节,但如果需要我可以提供源代码。我正在使用 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
中的退出因此,你们中的任何人都无法通过此描述解决问题。我将不得不再次查看所有内容并找到错误/错误。

最佳答案

我的两分钱:

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

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

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

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

关于C++ 预处理器包含和定义多个文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11799534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com