Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ stdafx.h跨平台无问题?_C++_Visual Studio_Cross Platform_Precompiled Headers_Stdafx.h - Fatal编程技术网

C++ stdafx.h跨平台无问题?

C++ stdafx.h跨平台无问题?,c++,visual-studio,cross-platform,precompiled-headers,stdafx.h,C++,Visual Studio,Cross Platform,Precompiled Headers,Stdafx.h,嘿,过去几天我一直在关注learncpp.com的tut,他们说要注释掉“#包括代码::块的.cpp文件中的“stdafx.h” 要删除包含行,这是必须的吗?如果您有数百个文件,并且从Win7上的Visual Studio更改为Linux上的Code::Blocks,或者将其交给其他使用mac的人,会发生什么情况?据我所知,stdafx.h是一个仅限Windows的文件(用于预编译标题):如果不注释,代码将无法编译。如果您实际上没有使用预编译头(PCH),我建议进入Visual Studio的选

嘿,过去几天我一直在关注learncpp.com的tut,他们说要注释掉“#包括代码::块的.cpp文件中的“stdafx.h”


要删除包含行,这是必须的吗?如果您有数百个文件,并且从Win7上的Visual Studio更改为Linux上的Code::Blocks,或者将其交给其他使用mac的人,会发生什么情况?

据我所知,stdafx.h是一个仅限Windows的文件(用于预编译标题):如果不注释,代码将无法编译。

如果您实际上没有使用预编译头(PCH),我建议进入Visual Studio的选项/首选项->预编译头并将其关闭。如果您尝试删除它们并仍使用Visual Studio,您将收到大量错误。

stdafx.h
是Visual Studio生态系统中用于预编译头的惯用名称。简言之,它是一个常规头,但是t此文件的内容将被编译一次,并重新用于项目中的所有cpp文件

这是很有用的,因为在大多数项目中,几乎所有翻译单元(CPP)都使用大量的头(标准库、系统头、共享的项目范围定义),因此在编译过程中使用PCH是一个巨大的性能优势

(事实上,PCH是一种针对C++低效编译和链接模型的黑客攻击,我们需要手工维护它,这真是太可惜了……哎呀,太亵渎了。)

但这也意味着,只要
stdafx.h
的内容与gcc兼容,使用代码块的编译应该仍然可以工作,但不会带来直接的性能好处


VS的应用程序向导生成的
stdafx.h
在其他平台上无法开箱即用——它通常包括
Windows.h
。因此,要让它起作用,请使用适当的
\ifdef/#endif
对来保护特定于Windows的定义,反之亦然,对于Linux或Mac特定的东西。

唯一要做的是在默认包含路径列表中包含包含stdafx.h(或预编译头)的路径。这是必需的,因为MS编译器实际上用预编译数据替换了
#include“stdafx.h”
,而没有真正查找头


其他编译器通常会希望拉入数据。但不应将其注释掉。通常,您可以调整编译器,以利用预编译头功能来增强编译。使用
gcc
,这将通过
-pch
选项完成。使用代码块,我可以找到预编译头s不是邪恶的,相反,如果理解和使用得当,它们会为您节省宝贵的时间。

不,教程中的建议没有任何意义。
stdafx.h
根本不会破坏任何东西。Visual Studio编译器中的预编译头系统就是这样设计的

如果您的编译器支持预编译头(并且遵循与Visual Studio相同的预编译方法),那么它可以使用
stdafx.h
进行预编译

如果您的编译器不支持预编译头文件(或使用了不同的预编译方法),则
stdafx.h
将被解释为普通头文件,与任何其他头文件没有区别,并以与任何其他头文件相同的方式处理


该教程的意思可能是,
stdafx.h
通常包含一些其他平台上不存在的特定于Windows的标题。虽然这是可能的,但它实际上与
stdafx.h
本身完全无关。显然,如果您在其他平台上编译程序,您不应该尝试使用它包括任何Windows标题,不管你是如何做的:通过
stdafx.h
或其他地方。

如果你不注释它会发生什么?你试过了吗?我的VS2010没有包括一个名为Windows.h的标题,它添加了targetver.h stdio.h tchar.h,就是这样。否则我可以把我在ubuntu上做的任何东西发送给我的朋友。试试我就可以了t-它本质上只是一个具有上述特殊名称的头文件。您更可能遇到其他兼容性问题,例如,在使用格式字符串或不同的字符串函数时。