我想知道为什么其他语言不支持此功能.我可以理解C/C++代码是依赖于平台的,因此可以通过使用预处理器指令实现跨各种平台的工作(编译和执行).除此之外,还有许多其他用途.就像你可以将所有调试printf放在里面#if DEBUG ... #endif.因此,在发布版本时,这些代码行不会在二进制文件中编译.
但在其他语言中,实现这个(后面的部分)是困难的(或者可能是不可能的,我不确定).所有代码都将在二进制文件中编译,增加其大小.所以我的问题是"为什么Java, or other modern compiled languages不支持这种功能?" 它允许您以非常方便的方式包含或排除二进制文件中的某些代码.
对于一些基地.基数1甚至.某种复杂的替代.
此外,当然,在现实生产代码中这样做并不是一个好主意.我只是出于好奇而被问到.
有没有人在编译时预先处理类注释的maven项目有一个干净的例子,后续生成的类将在同一个编译过程中编译?
有没有人有实施这样一个项目的分步过程?
好的,直到今天早上我才对这些术语感到困惑.我想我有所不同,希望如此.
首先,令人困惑的是,由于预处理器已将头文件包含在包含函数的代码中,因此链接器链接到汇编器/编译器生成的目标文件的库函数是什么?部分混淆主要是由于我对头文件和库之间的差异的无知而产生的.
经过一段谷歌搜索和堆栈溢出(就是术语?:p),我收集到头文件主要包含函数声明,而实际的实现是在另一个称为库的二进制文件中(我仍然不是100%)确定这个).
所以,假设在以下程序中: -
#include<stdio.h>
int main()
{
printf("whatever");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
预处理器包括代码中头文件的内容.编译器/编译器+汇编器完成其工作,然后最终链接器将此目标文件与另一个实际存储方式printf()工作的目标文件组合在一起.
我的理解是正确的吗?我可能会离开...你能帮我吗?
编辑:我一直想知道C++ STL.它总是让我困惑的是它究竟是什么,所有这些标题的集合或什么?在阅读完回复之后,我可以说STL是一个目标文件/类似于目标文件的东西吗?
还有,我觉得在那里我可以读的像函数的函数定义pow(),sqrt()等等等等,我会打开头文件,而不是发现什么.那么,库中的函数定义是否是二进制不可读的形式?
我必须使用MSVC2012和v100平台工具集(来自MSVC2010)构建项目.不幸的是,我在代码中使用C++ 11功能" 基于范围 ".我想知道是否有一个预处理器指令允许在编译时知道当前的平台工具集.即
#if (_MSC_PLATFORM_TOOLSET > 100)
# define ALLOW_RANGE_BASED_FOR 1
#else
# define ALLOW_RANGE_BASED_FOR 0
#endif
Run Code Online (Sandbox Code Playgroud)
我尝试使用_MSC_VER宏,但对于两个平台工具集,它设置为1700(这确实有意义,因为我仍在使用MSVC2012).我很感激任何建议.谢谢.
在我的项目中,有一个ifdef预处理器指令中包含的文件
#ifdef SOME_SYMBOL
... entire file ...
#endif
Run Code Online (Sandbox Code Playgroud)
SOME_SYMBOL由在此之前编译的另一个文件定义,并且代码按预期工作,但静态分析器不知道此符号,因此它对待SOME_SYMBOL未定义.整个文件没有语法突出显示,只是跳过了一些分析(例如语法错误突出显示).
有没有办法告诉分析器将此符号视为已定义,而不在CMakeLists.txt中定义它?
我没有在CMakeLists.txt中定义SOME_SYMBOL的选项,因为项目依赖于它在某些编译路径中未定义(更改这几乎是不可能的).
更新:
似乎这是目前JetBrains的一个未解决的问题.见问题CPP-2286
我想为GCC_PREPROCESSOR_DEFINITIONS我的四个构建配置(Debug,Release,Ad Hoc和Distribution)中的每一个设置.我想为每个配置设置不同的设置.
我正在看的屏幕是Target Info窗口的"Build"选项卡.当我将配置弹出窗口设置为"Debug"时,我可以GCC_PREPROCESSOR_DEFINITIONS在那里看到我的设置.当我切换到"发布"或任何其他配置时,它不再可见.然而,当我尝试将其添加到这些配置时,它GCC_PREPROCESSOR_DEFINITIONS已经存在,并且我无法再添加它.
正如我所说,我想为我的各种构建设置不同的设置.我怎么能做到这一点?
非常感谢.
我已经在一个(差不多完成的)Javascript项目上工作了14个多月了.该项目最初是我希望在一夜之间完成的黑客攻击,但随着时间的推移,Javascript部分已经成长为68个独立文件和10,314个非空行,遗憾的是目前依赖于C预处理器进行构建.
很难解释我最终是如何使用cpp来实现Javascript的:这只是一个黑客,我需要的东西能给我宏扩展,ifdef,define,并且不需要太多努力.经过大约3秒钟的考虑,我意识到cpp对于任务是"完美的":
像所有真正的黑客,这个破解是现在这么硬编码到,我真的恨也别想将需要更换的工作项目.我的项目是达到我想要的代码库迁移到自己的专用测试服务器(而不是我的笔记本电脑),但是在建立一个Linux实例,我发现舞台是GNU CPP版本4.1不再预处理后的Javascript与崩溃一起出错.
我认为现在是真正解决这个问题的好时机,而不是将特定版本的GCC添加到构建要求列表中.但问题是,我找不到具有与cpp相同功能和特性的替换预处理器!我考虑过m4,但是m4本身就是一个痛苦的世界.我发现的其他特定于Javascript的预处理器缺少我目前所依赖的所有功能,例如:
__FILE__ & __LINE__我正在认真考虑为Javascript实现一个全新的预处理器,它完全借用了C预处理器语法,因为它运行得很好.我只是想知道在这之前是否有更好的选择.:)也许已经有一个类似cpp的通用预处理器我可以交换?替换这68个文件中的所有预处理器语法所需的工作接近简单地重新实现预处理器所需的工作量.
到目前为止,依靠C预处理器,我感到非常惊讶; 在这项任务中,它比健康的心灵理解更有效.另一个对我开放的选择是为Linux,Darwin-i386,Win32静态构建cpp-4.1版本,并将这些二进制文件存储在项目的存储库中.
救命!
我正在看Apple的Lister(Apple Watch,iOS和OS X)样本.该示例对iOS和OS X执行测试:
#import <TargetConditionals.h>
#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)
@import ListerKit;
#elif TARGET_OS_MAC
@import ListerKitOSX;
#endif
Run Code Online (Sandbox Code Playgroud)
但是,没有测试TARGET_OS_WATCH或类似.Grepping for watchin TargetConditionals.h不会发出命中:
$ cat /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
/SDKs/iPhoneOS7.1.sdk/usr/include/TargetConditionals.h | grep -i watch
$
Run Code Online (Sandbox Code Playgroud)
从TargetConditionals.h,我知道有:
These conditionals specify in which Operating System the generated code will
run. The MAC/WIN32/UNIX conditionals are mutually exclusive. The EMBEDDED/IPHONE
conditionals are variants of TARGET_OS_MAC.
TARGET_OS_MAC - Generate code will run under Mac OS
TARGET_OS_WIN32 - Generate code will run under … preprocessor ×10
c ×4
javascript ×2
analysis ×1
build ×1
c++ ×1
clion ×1
header-files ×1
ios ×1
iphone ×1
java ×1
linker ×1
maven ×1
python ×1
visual-c++ ×1
watchkit ×1
watchos-2 ×1
xcode ×1