我正在编写一个库,如果包含特定的库,需要有一些代码.由于此代码分散在项目周围,如果用户不必自己评论/取消注释,那将是很好的.
在C中,这很容易用#define一个标题,然后是包围的代码块#ifdefs.当然,Java没有C预处理器......
为了澄清 - 我将分发几个外部库.我不想将它们全部包含在内以最小化我的可执行文件大小.如果开发人员确实包含了库,我需要能够使用它,如果没有,那么它就可以被忽略.
在Java中执行此操作的最佳方法是什么?
我的python代码与许多用于(调试|分析|跟踪等)的函数调用隔行扫描,例如:
import logging
logging.root.setLevel(logging.DEBUG)
logging.debug('hello')
j = 0
for i in range(10):
j += i
logging.debug('i %d j %d' % (i,j))
print(j)
logging.debug('bye')
Run Code Online (Sandbox Code Playgroud)
我想#define代码中的这些资源消耗函数.像c等价的东西
#define logging.debug(val)
Run Code Online (Sandbox Code Playgroud)
是的,我知道日志模块日志记录级别机制可用于屏蔽低于设置日志级别的日志记录.但是,我要求一般方法让python解释器跳过功能(即使他们不做太多也需要时间运行)
一个想法是重新定义我想要注释到空函数的函数:
def lazy(*args): pass
logging.debug = lazy
Run Code Online (Sandbox Code Playgroud)
上述想法仍然会调用一个函数,并可能产生无数其他问题
如何禁用T4模板验证.VS2010刚刚验证了我的T4模板,其中有'#'(尖锐的角色).
error CS1040: Preprocessor directives must appear as the first non-whitespace character on a line
Run Code Online (Sandbox Code Playgroud)
这个错误是无稽之谈.我甚至可以从我的模板生成代码,但我无法运行我的项目,因为我的模板抛出错误CS1040.
安装visual t4后出现此错误,即使从扩展管理器卸载也无法正常工作.为VS2010安装Visual T4给我带来亚音速模板的问题.禁用和卸载也没有帮助.我很失望.
我一直在为iOS进行大量的不同库的交叉编译,直到iOS5没有问题.好吧,显然我的问题是,iOS5 SDK不再包含GNU gcc编译器了.只有llvm和clang可用.
我的问题是,我无法完成运行任何库的'configure'脚本.它始终失败:
configure: error: C preprocessor
"/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc" fails sanity check
Run Code Online (Sandbox Code Playgroud)
gcc只是llvm编译器的符号链接.如果我将其设置为clang,则会产生相同的错误.(只是使用更好的语法错误表示)
这是config.log的重要部分:
configure:3338: checking how to recognise dependent libraries
configure:3514: result: pass_all
configure:3993: checking how to run the C preprocessor
configure:4111: result: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc
configure:4135: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc -B/Developer/Platforms/iPhoneOS.platform/Developer/usr -arch armv7 -miphoneos-version-min=5.0 -gdwarf-2 -mthumb -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib/system conftest.c
conftest.c:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'error'
configure:4141: $? = 1
configure: failed program was:
| /* confdefs.h. */
|
| #define PACKAGE_NAME "expat"
| #define PACKAGE_TARNAME "expat"
| …Run Code Online (Sandbox Code Playgroud) 整个项目都需要版本号; 在安装程序,代码,工具链等.我鄙视重复.我希望我的版本号存储在一个中心权威位置.
我正在使用C/C++并在各种平台上使用Qt.在Qt中,qmake项目指定版本号,如:
VERSION = 1.2.3
Run Code Online (Sandbox Code Playgroud)
在代码中我使用像Version.h这样的标题:
#define VERSION_MAJ 1
#define VERSION_MIN 2
#define VERSION_REV 3
#define VERSION_STRING \"VERSION_MAJ\" "." \"VERSION_MIN\" "." \"VERSION_REV\"
Run Code Online (Sandbox Code Playgroud)
我的安装程序工具链支持C预处理,因此我可以使用Version.h中指定的相同版本.但是,我不知道如何让qmake使用相同的版本号.我以为我可以预处理专业文件,但这不起作用,因为#字符意味着在pro文件中的注释,C预处理器将会失败.
有人知道保持我的版本号集中的好方法吗?
我正在做一个实验,一个像SLIM或Jade这样的html预处理器.
这是似乎正确的PHP代码:
nav
ul id: "test"
li
@<?= $Var; ?>
li
@About
li
@Contact
Run Code Online (Sandbox Code Playgroud)
这是预期的预处理html(是的,$ Var =="Test"):
nav
ul id: "test"
li
@Test
li
@About
li
@Contact
Run Code Online (Sandbox Code Playgroud)
但是,在浏览器中我得到这个错误的文本作为预处理器html:
nav
ul id: "test"
li
@Test li
@About
li
@Contact
Run Code Online (Sandbox Code Playgroud)
最后,有两种方法可以使其正确.
手动添加分隔线:
nav
ul id: "test"
li
@<?= $Var . "\n"; ?>
li
@About
li
@Contact
Run Code Online (Sandbox Code Playgroud)在PHP结束标记之后写一个空格(??).
为什么是第一种情况,<?= $Var; ?>忽略关闭PHP标记后的换行符?我真的找不到任何东西,因为谷歌带来了太多的结果,为什么你应该忽略我做的每一次搜索的结束标记,而不是我想要找到的.
我有一个非常大的C和C++代码(~200k loc),它广泛使用了糟糕的宏:
/* ... */
#define PRIVATE static
#define BEGIN {
#define END }
/* ... */
#define WHILE(e) while (e) {
#define DO /* yep, it's empty */
#define ENDWHILE }
/* and it goes on and on, for every keyword of the language */
Run Code Online (Sandbox Code Playgroud)
这是事情,我想摆脱那个愚蠢的标题,清理代码,并正确地缩进它.
起初,我想用一个简单的方法sed来替换所有这些宏,但似乎并不那么简单.
这种情况WHILE很成问题(其他陈述也是如此).我不能替换WHILE为juste while,因为开口的花括号将会丢失.当然,由于DO宏没有做任何事情,它并不总是出现在代码中.因此,取代DO通过{不会做的伎俩.
我也不能使用结束语,因为条件通常分为多行:
WHILE (clsr_calibragedf_tabdisque.tab_disque[indice_disque].tab_date[indice_date] NE
clsr_calibragedf_tabdate [indice].date) DO
indice ++;
ENDWHILE
Run Code Online (Sandbox Code Playgroud)
我能想到的最好的解决方案是C预处理器,它只能替换特定的宏,而不能扩展#include指令或其他宏.但我找不到那样的东西.
任何的想法?
我有一个Xcode5项目(A)依赖于另一个XCode5项目(B).项目B包含在项目A中作为子项目.项目B需要从项目A传递预处理器定义,但这似乎是一项不可能完成的任务.根据设计,预处理器定义不会从一个父XCode项目传递到其子项目.我已经尝试在XCode Scheme中设置一个环境变量,并在项目B中选择一个,但这也不起作用.我不知道该怎么做,虽然我已经整整一个早上就已经过了......
重要的注意事项:我不想更改项目B中的任何内容,因为它是一个将被许多父项目使用的项目,并且更改(即预处理器定义)应仅在父项目中进行,但从不在项目B中进行.
编辑:一个非常简单的可能性是在项目A中有一些"config.h"头文件和一些预处理器定义,而项目B将包含这个文件.但是没有专门将该文件的目录添加到项目B的头包含目录中,我不知道如何告诉XCode找到这个文件(再次:我从不想对项目B进行更改).
我正在尝试使用自己的构建系统构建freetype2(我不想使用Jam,我准备花时间去搞清楚它).我在标题中发现了一些奇怪的东西.Freetype定义了这样的宏:
#define FT_CID_H <freetype/ftcid.h>
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它们:
#include FT_CID_H
Run Code Online (Sandbox Code Playgroud)
我不认为这是可能的,确实Clang 3.9.1抱怨:
error: expected "FILENAME" or <FILENAME>
#include FT_CID_H
Run Code Online (Sandbox Code Playgroud)
这与如何在#include指令中使用宏有关?但不同,因为这里的问题是关于编译freetype,而不是编写新代码.
我正在读关于宏观替换的标准N1570并且误解了一些措辞6.10.3.4.
1替换列表中的所有参数都已被替换并且#和##处理已经发生后,将删除所有地标标记预处理标记.然后重新扫描生成的预处理标记序列以及源文件的所有后续预处理标记,以替换更多的宏名称
所以,毕竟#并##解决了我们重新扫描替换列表.但第2节规定:
2如果在替换列表的扫描期间找到要替换的宏的名称(不包括源文件的其余预处理标记),则不会替换它.此外,如果任何嵌套替换遇到要替换的宏的名称,则不会替换它.
这看起来与我相矛盾.那么在重新扫描中可以进行哪种替换?我尝试了以下示例:
#define FOOBAR(a, b) printf(#a #b)
#define INVOKE(a, b) a##b(a, b)
int main() {
INVOKE(FOO, BAR); //expands to printf("FOO" "BAR")
}
Run Code Online (Sandbox Code Playgroud)
因此INVOKE(FOO, BAR),FOOBAR(FOO, BAR)在取代之后扩展到##.然后FOOBAR(FOO, BAR)重新扫描替换列表.但是该部分2.指定被替换的宏的名称(FOOBAR)是(是的,上面定义的)它没有被替换(但实际上被替换,如在演示中可以看到的).
你能澄清一下这个措辞吗?我错过了什么?