对于我的日志记录,我希望能够在编译时宏指令语句,所以 - 定义为救援!
对于我正在使用erlc -DFOO编译的编译器标志,有没有办法让-ifdef来确定FOO = ok,FOO/0和FOO/1之间的区别?
-module(foo).
-define(FOO, ok).
-define(FOO(X), io:format("~p~n", [X])).
-export([test_x/1]).
%% i want this to be true iff FOO = ok, not if ?FOO/1 exists
-ifdef(FOO).
test_x(X) ->
?FOO(":) " ++ X).
-else.
test_x(X) ->
?FOO(":( " ++ X).
-endif.
Run Code Online (Sandbox Code Playgroud) 我使用Visual Studio 2010 Premium.我有两个项目A和B,我尝试将它们编译为64位平台.
项目A输出项目B依赖的.dll和.lib文件.
我已经成功地将项目A编译到64位平台,但是当我编译项目BI时会出现以下错误:
mfcs100d.lib(nolib.obj):致命错误LNK1112:模块机器类型'X86'与目标机器类型'x64'冲突
可能是什么问题呢 ?我真的不知道这个mfcs100d.lib文件是什么.
我在项目A的dll文件上使用了"Dependency Walker",它似乎完全依赖于64位dll文件.另外,我进入了项目B(属性页 - >配置属性 - >链接器 - >高级)并确认'目标机'设置为"MachineX64".此外,在配置管理器上,平台设置为x64.
有人告诉我问题可能是这样的:
转到项目B(属性页 - >配置属性 - > C\C++ - >预处理器 - >预处理器定义)我有以下值:
WIN32
_DEBUG
_WINDOWS
_AFXEXT
Run Code Online (Sandbox Code Playgroud)
那是真的相关吗?我应该更换'WIN32'值吗?如果是的话,怎么样?我真的不明白这些定义的含义以及如何改变它们.
编辑:我刚刚意识到它可能完全不相关.这些只是预处理器的定义,例如可以通过C++ #define命令确定的定义.但我可能是错的.
我想在java语法中进行一些更改.例如,我想使用运算符'+'来添加向量.所以我想要这个代码:
public class Vector2 {
public float x, y;
public Vector2(float x, float y) {this.x = x;this.y = y;}
public String toString() {...}
public static Vector2 operator+(Vector2 a, Vector2 b) {
return new Vector2(a.x + b.x, a.y + b.y);
}
public static void main(String[] args) {
Vector2 a = new Vector2(3, 6);
Vector2 b = new Vector2(2, 8);
System.out.println(a + b);
}
}
Run Code Online (Sandbox Code Playgroud)
将被转换为这个标准的java代码:
public class Vector2 {
public float x, y;
public Vector2(float x, float y) {this.x …Run Code Online (Sandbox Code Playgroud) 我有一个使用Facebook Framework的应用程序,它工作正常.我写了一个单元测试,当我运行它时,我收到这个错误:
Lexical or Preprocessor Issue - FacebookSDK/FacebookSDK.h file not found ProjectName-Prefix.pch
Run Code Online (Sandbox Code Playgroud)
为什么会在测试中发生,而不是在run/build/archive中?
更新:1)尝试始终使用用户...路径
2)清理工作区
他们都没有工作
解析包含#define和的haskell源文件时#if,parseFileContentsWithMode会混淆并抛出有关散列的错误.我想包括MagicHash和CPP扩展名列表(extns见下文),但没有奏效.我无法真正更改源文件,因为它们有很多.
getModule extns filePath program = fromParseResult $ parseFileContentsWithMode mode program
where
bangPatternsExt = map parseExtension extns
mode = ParseMode filePath Haskell2010 bangPatternsExt False False
Run Code Online (Sandbox Code Playgroud)
解析器失败了:
#if __GLASGOW_HASKELL__ >= 612
instance Lift ModName where
lift = lift . modString
Run Code Online (Sandbox Code Playgroud) 我正在从Eclipse CDT转换。当使用预处理器定义(无论是在Makefile中明确指定还是通过外部自动生成的头文件包含在内)在C / C ++代码中浏览时,预处理器宏功能是必需的。如果没有这个,就无法导航Linux源代码,如本开创性的Wiki页面上有关使用Eclipse研究Linux代码所述。我正在寻找VSC的等效功能。希望有一个指针。
带问候
我读到#defining和#undefining在一个块里面是代码味道.这是为什么?另外,我在代码中看到(只是一个显示我在实际代码中的内容的示例),这个编译,
if(x == 1000) {
#define MACRO_EXAMPLE 1
} else {
#define MACRO_EXAMPLE 1
}
Run Code Online (Sandbox Code Playgroud)
但这不编译,
if(x == 1000) {
#define MACRO_EXAMPLE 1
} else {
#define MACRO_EXAMPLE 2
}
Run Code Online (Sandbox Code Playgroud)
有错误 warning C4005: 'MACRO_EXAMPLE' : macro redefinition
这是如何预处理的?它是如何工作的?
我有以下代码:
#include <stdio.h>
enum {A, B};
#define C A
int main() {
#if C == B
printf("%d==%d\n", C, B);
#else
printf("%d!=%d\n", C, B);
#endif
}
Run Code Online (Sandbox Code Playgroud)
这令人惊讶地给出了输出:
0==1
Run Code Online (Sandbox Code Playgroud)
现在,我理解代码是错误的,因为预处理器不知道枚举值.我不明白为什么没有生成错误... A和B应该在预处理时间未定义,预处理器如何不给出错误?
当我使用“POSIX 间隔计时器”或进行信号处理时,我必须插入
#define _POSIX_C_SOURCE 200809L
Run Code Online (Sandbox Code Playgroud)
在我的任何文件中的第 1 行。但我发现只有 C 代码需要它,而不是 C++ 代码。
在这个问题上g++,gcc编译器与编译器的工作方式有何不同?
下面是我的系统环境(gcc:相同版本)
user@~ $ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)
我构建了在 CMakeLists.txt 中添加这一行的项目
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++14 -Wall")
Run Code Online (Sandbox Code Playgroud) 在这里,我有一个示例项目,其中包含两个源文件和一个头文件,如下所示:
main.c:
#include<stdio.h>
#include "personal.h"
int main(){
i = 5;
printf("Value is %d\n",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
sub.c:
#include "personal.h"
// do nothing
Run Code Online (Sandbox Code Playgroud)
最后是personal.h:
#pragma once
int i;
Run Code Online (Sandbox Code Playgroud)
每个.c文件都包含personal.h,后者受“保护”。我用gcc编译,一切正常:
>gcc sub.c main.c -o out
>./out
Value is 5
Run Code Online (Sandbox Code Playgroud)
但是对于g ++,会发生这种情况:
>g++ sub.c main.c -o out
/tmp/cctYwVnO.o:(.bss+0x0): multiple definition of `i'
/tmp/ccPElZ27.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
在文件链接方式,预处理器活动等方面,C ++和C之间在本质上有什么不同吗?我对其他编译器(如clang)尝试了相同的操作,并且发生了相同的情况。我也许在这里想念一些愚蠢的东西。
preprocessor ×10
c ×4
c++ ×3
64-bit ×1
compilation ×1
erlang ×1
haskell ×1
include ×1
java ×1
macros ×1
unit-testing ×1
xcode ×1