MS Visual Studio 2010 C++ 预处理器 - 如果函数在宏中定义并在其他地方调用,未定义时是不是有任何开销
Posted
技术标签:
【中文标题】MS Visual Studio 2010 C++ 预处理器 - 如果函数在宏中定义并在其他地方调用,未定义时是不是有任何开销【英文标题】:MS Visual Studio 2010 C++ Preprocessor - If function is defined in macro with calls elsewhere, is there any overhead hit when undefinedMS Visual Studio 2010 C++ 预处理器 - 如果函数在宏中定义并在其他地方调用,未定义时是否有任何开销 【发布时间】:2014-03-27 21:41:02 【问题描述】:我有一个简短的问题,我确信有人问过这个问题,所以如果它是重复的,我深表歉意。我尝试搜索 google 和 ***,但结果与我的问题无关。
场景:
我有一个 Visual Studio 2010 项目配置,它定义了一个名为 DBG 的预处理器。 在代码中,我有一个 #ifdef DBG 部分,它在头文件中声明一个函数签名(我们称之为 writeToFile),并在 cpp 文件的另一个 #ifdef DBG/#endif 部分中定义该函数。 整个项目的其余部分都是对 writeToFile 的调用。
问题:
当项目在不同的配置(未定义 DBG)下编译时,编译器如何处理?我知道#ifdef/endif 指令中的部分几乎被忽略了,但是对 writeToFile 的所有函数调用会发生什么?编译器是否也忽略了这些?或者在运行时,这些调用是否真的发生并且什么都不做?
提前致谢
【问题讨论】:
查阅你最喜欢的C语言书籍,关于预处理器的工作方式,有很多而且K&R很薄。 #ifdef 中不匹配的任何文本都将被完全删除。在编译器可以看到源代码之前。 是的,我知道。我的问题是当没有匹配时,#ifdef/#endif 之外的代码会发生什么(有条件地定义函数的函数调用)。 显然您应该期待以下之一:a) 巨响,b) 从您的机器中冒出白烟,c) 错误列表窗口中的错误消息。 c) 最有可能。 如下所述,没有错误或问题。我已经这样做了2年了。我只是想知道今天引擎盖下会发生什么...... 【参考方案1】:我怀疑编译器应该抛出错误(未定义函数writeToFile()
)。但是您应该能够通过指定#else
部分来解决这个问题,该部分定义了具有空主体的相同功能。即。
#ifdef DBG
void fun() cout << "hello";
#else
void fun() ;
#endif //DBG
编辑:
我个人只会定义你想要的函数,然后将 #ifdef/#endif
块放在它的主体内。
【讨论】:
奇怪的是,编译器没有抛出错误,所以我想知道编译器是如何处理它的……我确实在 #ifdef/#endif 中定义了函数…… 你可以使用调试器进入函数吗?是否可能还有另一个同名函数? 不幸的是,这是另一个我无法控制的进程的插件 dll,并且调试器无法工作。这就是为什么我首先拥有这个条件函数(我正在调试项目中记录到文件)。我不认为有另一个同名的函数,事实上,我可以更改函数名并发生同样的事情......以上是关于MS Visual Studio 2010 C++ 预处理器 - 如果函数在宏中定义并在其他地方调用,未定义时是不是有任何开销的主要内容,如果未能解决你的问题,请参考以下文章
MS Visual Studio 2010 C++ 预处理器 - 如果函数在宏中定义并在其他地方调用,未定义时是不是有任何开销
将 C++ 项目从 Visual Studio 2008 转换为 Visual Studio 2010
电脑问题 Microsoft visual c++ Runtime Library
MS Visual Studio 2012 Express 是不是同时包含 C#、Visual Basic、C++? [关闭]