在我的项目中,有一个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
我有从外部开发人员那里收到的源代码,这个代码分为4种类型的项目:他们的框架,我的项目的环境(让我们称之为"ENV"),应用程序库(称之为"Base")和应用程序本身(约20个dll我将统称为"App").
现在,我已经为这个混乱添加了另一层,一个名为AdvanceFeatures的dll.它位于ENV(框架顶部)的正下方.这个dll只引用框架,ENV引用它.只有ENV使用这个AdvanceFeatures dll,而Base和App只使用ENV.
我在这里工作的方式是App中的大多数对象都在Base中定义,并在ENV中继承/实现类/接口.这些对象中的一小部分(在App和Base中)从框架本身继承/实现类/接口(但这种情况非常罕见).
除了一个事实,到目前为止一切都很顺利.编译器要求我将从App中的每个dll和Base中添加对AdvanceFeatures dll的引用.
我没有在ENV之外使用AdvanceFeatures,那么为什么需要这些引用呢?
编辑:我已经为这个问题创建了一个演示项目.这是项目细节:
Assembly: AdvanceFeatures
References: Nothing (Reference project-folder is empty)
Classes: Decorator, IEnvClass, IDecorator
IDecorator contents:
namespace AdvanceFeatures
{
public interface IDecorator
{
IEnvClass Decorated { get; }
void Decorate();
}
}
IEnvClass contents:
namespace AdvanceFeatures
{
public interface IEnvClass
{
string Name { get; set; }
}
}
Decorator contents:
namespace AdvanceFeatures
{
public class Decorator : IDecorator
{
public Decorator(IEnvClass decorated)
{
Decorated = decorated;
}
#region Implementation of IDecorator
public IEnvClass …
Run Code Online (Sandbox Code Playgroud) 我需要编译我的源代码以与jre 1.6兼容.但是,当我尝试将javac任务的编译器属性设置为javac1.6时,ant仍将使用javac1.7编译我的代码.我也尝试将编译器版本设置为"现代",但没有帮助.
<target name="compile-tests">
<javac compiler="javac1.6" includeantruntime="false" srcdir="${test.dir}"
destdir="${build.dir}" >
<classpath refid="class.path" />
</javac>
</target>
Run Code Online (Sandbox Code Playgroud)
我的JAVA_HOME设置为JDK 1.6:
echo $JAVA_HOME </code> gives: <code>
/usr/lib/jvm/java-6-openjdk-amd64/
Run Code Online (Sandbox Code Playgroud)
我的ant版本是:Apache Ant(TM)版本1.8.2
根据这篇文章,ant使用自己的编译器.如何覆盖ant默认值?另外,根据这篇文章和ant文档,我可以设置全局build.compiler属性.我该怎么设置该属性,我该怎么做?
在控制段上的可执行位的过程中,我发现了PT_GNU_STACK
加载程序如何使用的一个巨大的怪癖。
根据elf(5)
联机帮助页,PT_GNU_STACK
用作:
GNU 扩展,Linux 内核使用它通过 p_flags 成员中设置的标志来控制堆栈的状态。
该execstack
手册页,也支持这一点:
... ELF 二进制文件和共享库现在可以标记为需要或不需要可执行堆栈。此标记是通过 PT_GNU_STACK 程序头条目中的 p_flags 字段完成的。
但是,除了设置堆栈可执行文件之外,当我设置该位时,几乎所有段都变为可执行文件。
例如,当我运行时sleep
,我得到了这个内存映射
sleep 100 & cat /proc/$!/maps
[1] 1260
561460d8d000-561460d94000 r-xp 00000000 08:01 524383 /bin/sleep
561460f94000-561460f95000 r--p 00007000 08:01 524383 /bin/sleep
561460f95000-561460f96000 rw-p 00008000 08:01 524383 /bin/sleep
561462eca000-561462eeb000 rw-p 00000000 00:00 0 [heap]
7f02b08b9000-7f02b0b97000 r--p 00000000 08:01 1966102 /usr/lib/locale/locale-archive
7f02b0b97000-7f02b0d7e000 r-xp 00000000 08:01 655384 /lib/x86_64-linux-gnu/libc-2.27.so
7f02b0d7e000-7f02b0f7e000 ---p 001e7000 08:01 655384 /lib/x86_64-linux-gnu/libc-2.27.so
7f02b0f7e000-7f02b0f82000 r--p …
Run Code Online (Sandbox Code Playgroud) 在重写我的事件调用函数以一般地处理事件及其参数之后,我开始检查我的代码(以匹配更改),并且我注意到编译器隐式地进行了泛型调用.
这是我的功能:
private void InvokeEvent<TArgs>(EventHandler<TArgs> invokedevent, TArgs args)
where TArgs : EventArgs
{
EventHandler<TArgs> temp = invokedevent;
if (temp != null)
{
temp(this, args);
}
}
Run Code Online (Sandbox Code Playgroud)
这是调用函数的行:
InvokeEvent(AfterInteraction, result);
Run Code Online (Sandbox Code Playgroud)
这编译没有问题,智能感知甚至显示"正确"调用(与部分).
这是一个编译器功能(通用类型实际上可以直接从第二个参数推断出来),还是我疯了什么都没有,并且忽略了这一点?