我正在为我们的构建系统编写一些工具,以对属于包含某些注释的类的方法强制执行一些严格的调用约定.
我正在使用编译器树API ...
我想知道的是当遍历'tree'时,你怎么能告诉MethodInvocation的类/接口的类型.
我将TreePathScanner子类化为:
@Override
public Object visitMethodInvocation(MethodInvocationTree node, Trees trees) {
}
Run Code Online (Sandbox Code Playgroud)
我希望有一种方法可以告诉您尝试调用该方法的类(或接口)的类型.我是以错误的方式来做这件事的吗?谢谢你的任何想法......
我正在寻找一种在adobe flex中做类似于ac/c ++ #define的方法.
我希望项目构建可以采用许多不同的路径,具体取决于枯萎或未定义的东西.flex中存在这样的东西吗?
我知道有办法设置全局变量,但这并不适合我的目的.能够拥有众多#ifndefined的结构,这就是我真正需要的东西.
谢谢!
我正在为一个简单的宠物语言编写一个简单的编译器,我正在创建并来自C背景(虽然我用Ruby编写)我想知道是否需要预处理器.
你怎么看?现代语言中仍然需要"哑"预处理器吗?C#的条件编译功能会被视为"预处理器"吗?是否每种不包含预处理器的现代语言都具有正确替换它所需的实用程序?(例如,由于模板,C++预处理器现在已经过时(尽管仍然依赖).)
通常我可以使用一些工具来静态分析我的代码,以帮助我使其更清洁.像编译器警告的东西,但这些还不够.我时不时地想要写一个(使用clang库或gccxml),但我想这需要太多的工作.
我想到的一些事情是:
寻找神奇的数字(即:不同于0的硬编码常数).
检查三个规则是否始终受到尊重(每个类必须定义所有析构函数,复制构造函数和赋值运算符,或者都不定义).
我也梦想(但这些东西都是纯粹的乌托邦)关于预处理器,它解析一些非标准代码并将其转换为有效的C++代码,这个工具能够:
扩展模板别名,以便我可以在C++中使用它们(好吧,使用C++ 0x不再需要它)
在文件末尾移动内联函数,这样我就不必遵守declare-before-use规则,并且能够像在Java中一样编写内联类.
提供扩展语法,如支持自定义运算符(将在函数调用中扩展),或一些特殊语法/关键字,以轻松实现某些模式.
有没有任何工具,能够做这些事情的一部分?
否则你会建议哪些库来实现这些任务(clang libs,gccxml,...),你认为需要做多少工作?
阅读C库的套接字接口的代码,我发现了这个:
/* Types of sockets. */
enum __socket_type
{
SOCK_STREAM = 1, /* Sequenced, reliable, connection-based
byte streams. */
#define SOCK_STREAM SOCK_STREAM
SOCK_DGRAM = 2, /* Connectionless, unreliable datagrams
of fixed maximum length. */
#define SOCK_DGRAM SOCK_DGRAM
...
Run Code Online (Sandbox Code Playgroud)
这个"成语"遍及bits/socket.h.我只是好奇,那些宏的目的是什么?
在像C/C++/Objective-C这样的语言中,通常使用预处理器宏来定义甚至不为已发布的二进制文件编译的日志记录机制,从而不会导致性能损失.有点像:
#ifdef DEBUG
printf("some event we want to log\n");
#endif
Run Code Online (Sandbox Code Playgroud)
现在,我知道Scala中没有预处理器.所以我的问题是:为了调试目的,实现记录程序活动的机制的最佳方法是什么,而在关闭时影响性能最少?
我正在用C编写一个库项目,可以使用或不使用QT构建.是否有任何预处理程序指令(不需要额外的标头)可用于区分QT是否在C代码中使用?
我想做的事情如下:
#ifdef I_AM_QT
// some qt specific codes
#else
// some codes for other environments
#endif
Run Code Online (Sandbox Code Playgroud)
谢谢.
我无法cmake测试是否已定义预处理器.例如:
cmake_minimum_required(VERSION 2.8.9)
project (cmake-test)
add_definitions(-DOS=LINUX)
if(NOT <what condition goes here?>)
message(FATAL_ERROR "OS is not defined")
endif()
Run Code Online (Sandbox Code Playgroud)
以下测试不起作用:
if (NOT COMMAND OS)
if (NOT DEFINED OS)
if (NOT OS)
Run Code Online (Sandbox Code Playgroud)
我可以通过使用set()并测试常规cmake变量然后定义预处理器宏来使其工作.例如:
set(OS LINUX)
if (OS)
add_definitions(-DOS=${OS})
else()
message(FATAL_ERROR "OS is not defined")
endif()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,你想知道为什么我需要测试它,如果变量/预处理器在同一个文件中,那是因为在最终实现中这些将来include自主CMakeFile.txt中的外部文件例如:
include(project_defs.txt)
if (OS)
....
Run Code Online (Sandbox Code Playgroud) 我想这两个cpp foo.c和gcc -E foo.c做预处理源文件相同的方式,但我得到了他们的输出为同一个文件的不同.
$ cat foo.c
#define VARIABLE 3
#define PASTER(x,y) x ## _ ## y
#define EVALUATOR(x,y) PASTER(x,y)
#define NAME(fun) EVALUATOR(fun, VARIABLE)
extern void NAME(mine);
Run Code Online (Sandbox Code Playgroud)
结果cpp:
$ cpp foo.c
# 1 "foo.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 329 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "foo.c" 2
extern void mine ## _ ## 3;
$
Run Code Online (Sandbox Code Playgroud)
结果gcc -E和clang -E: …
我在VS2015 MFC项目中找到了以下代码.
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG1 };
#endif
Run Code Online (Sandbox Code Playgroud)
我想了解这个预处理器的目的.谷歌没有给我任何足够的东西.如果你能对它有所了解,我将不胜感激.
preprocessor ×10
c ×2
annotations ×1
apache-flex ×1
c++ ×1
cmake ×1
constants ×1
debugging ×1
dialog ×1
enums ×1
flex3 ×1
gcc ×1
java ×1
javac ×1
logging ×1
mfc ×1
optimization ×1
parsing ×1
qt ×1
scala ×1