我有外部.DLL文件,里面有快速汇编程序代码.调用此.DLL文件中的函数以获得最佳性能的最佳方法是什么?
我必须将一些C/C++代码转换为Java.我的C++非常生疏.
在.h文件中,我有以下内容:
#ifdef __cplusplus
extern "C" {
#endif
/* tons of declarations */
#ifdef __cplusplus
} /* extern C */
#endif
Run Code Online (Sandbox Code Playgroud)
有什么用extern "C"?这是什么意思?它告诉编译器相应的代码应该被解释为纯C而不是C++吗?
编辑
谢谢你到目前为止的答案.我必须转换的代码的历史是,它似乎首先用C语言编写,然后其余部分用C++编写.所以我的头文件似乎对应于'旧的'C代码.
我将此代码转换为public final class静态方法和属性.没有压倒一切.
我在网上做了一些搜索,但我找不到如何从linux编译一个简单的C++和Fortran代码.我需要让它变得复杂,但我只需要知道如何从一个简单的例子开始.
我的C++代码是这样的:
#include <iostream>
using namespace std;
extern int Add( int *, int * );
extern int Multiply( int *, int * );
int main()
{
int a,b,c;
cout << "Enter 2 values: ";
cin >> a >> b;
c = Add(&a,&b);
cout << a << " + " << b << " = " << c << endl;
c = Multiply(&a,&b);
cout << a << " * " << b << " = " << c << endl;
return …Run Code Online (Sandbox Code Playgroud) 您正在查看一些Objective-C代码,并发现以下声明:
OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
这意味着什么?那么,这个陈述的语法应该是什么?
提前致谢
我正在编写一个C++共享库供C程序使用.但是,我有一个关于extern和的问题extern "C".
请考虑以下代码
我的头文件是这样的:
#ifdef __cplusplus
extern "C" int global;
extern "C" int addnumbers(int a, int b);
#else
extern int global;
#endif
Run Code Online (Sandbox Code Playgroud)
这完美无缺; 我只需要申报
int global;
Run Code Online (Sandbox Code Playgroud)
在我的.cpp或我的.c文件中.但是,我不明白的是:
extern "C"和extern这里有什么区别?我试着评论出来extern "C" int global并且有效!为什么?
我知道这extern "C"用于制作C链接.这就是我的原因extern "C" int addnumbers(int,int).换句话说,如果我想编写一个将在C程序中使用的C++函数,我会写extern "C".现在,全球变量怎么样 - 我猜这里的情况有所不同?我想C程序使用一个名为C++变量global,但我可以用extern不extern "C".这是为什么?这对我来说并不直观.
评论:我不认为这是重复的,因为我问的是当你将它用于变量与函数时有什么区别.
我想在c ++源代码中定义一个应该是POD的结构(所以它应该基于C标准而不是C++编译)
例如,假设我在c ++文件中有以下代码:
struct myStruct
{
int x;
int y;
}
class MyClass
{
int x;
int y;
}
Run Code Online (Sandbox Code Playgroud)
如果我编译此代码,struct是POD,应该编译为POD.因此,成员变量的位置遵循C标准,该标准已明确定义.
但假设用户可能会错误地将代码更改为此代码:
struct myStruct
{
int x;
int y;
private:
int z;
}
class MyClass
{
int x;
int y;
}
Run Code Online (Sandbox Code Playgroud)
现在结构不是POD,编译器可以自由地将成员变量放在内存中.
如何强制编译器确保始终根据C标准编译结构?
请注意,我不能将代码放在*.c代码中,因为我正在开发一个可以包含在*.cpp源代码中的头代码.
我已经使用 C++ 编写了一个在 ARM Cortex-M (STM32F0) 上运行的项目,但是我在将定义的缓冲区作为类成员访问时遇到了一些问题,尽管我通过将它们定义为全局变量来解决这个问题。
但是现在我完全被这个新问题困住了,我不知道该怎么办。
我有一个代码可以解锁闪存并向其中写入内容并关闭它。如果我在 C 文件中实现它并通过 C 自然运行它(从 main.c 调用)它工作完美。但是通过 C++ 文件(无论是写在 C 还是 C++ 源文件中)调用它会抛出一个 HardFault 异常。
static uint32_t waitForLastOperation(uint32_t msDelay)
{
while (READ_BIT(FLASH->SR, FLASH_SR_BSY) && msDelay)
{
LL_mDelay(1);
msDelay--;
}
/* Check FLASH End of Operation flag */
if (READ_BIT((FLASH->SR), (FLASH_SR_EOP)))
{
/* Clear FLASH End of Operation pending bit */
(FLASH->SR) = (FLASH_SR_EOP);
}
if (READ_BIT((FLASH->SR),
(FLASH_SR_WRPERR)) || READ_BIT((FLASH->SR), (FLASH_SR_PGERR)))
{
FLASH->SR = 0U;
return 0;
}
/* There is no error …Run Code Online (Sandbox Code Playgroud) 以下程序编译为 C 程序:
\n#include <stdlib.h>\n#include <stdio.h>\n\nvoid f(int n, int m, int x[n][m]) {\n printf("x[0][2] = %i\\n",x[0][2]);\n}\n\nint main() {\n int v[][3] = { {0,1,2}, {3,4,5} };\n\n f(2,3,v);\n}\nRun Code Online (Sandbox Code Playgroud)\n然而,当用 g++ 编译为 C++ 时,我有:
\nmain.c:4:29: error: use of parameter outside function body before \xe2\x80\x98]\xe2\x80\x99 token\n void f(int n, int m, int x[n][m]) {\n ^\nRun Code Online (Sandbox Code Playgroud)\n看来C的这个特性在C++中并不存在。是否可以向 g++ 提供任何标志以使其接受代码?
\n我正在使用android并试图在我的应用程序中使用一些本机代码.
这是应用程序代码的框架:
package A.B;
/*
import statements
*/
public class C extends Activity{
public void onCreate(...){
....
foo();
....
}
public int foo(){
.....
data(a, b);
.....
}
public int data(a, b){
GetValues(a, b);
}
static{
System.loadLibrary("baz");
}
public native int GetValues(int[] a, int b);
}
Run Code Online (Sandbox Code Playgroud)
本机方法签名如下:
JNIEXPORT jint JNICALL
Java_A_B_C_GetValues(JNIEnv *env, jobject obj, jintArray arr, jint b){
....
....
}
Run Code Online (Sandbox Code Playgroud)
运行logcat时显示:W/dalvikvm(799):找不到本机LA/B/C的实现; .GetValues([IJ] I
ndk文档并没有严格提到创建一个头文件,所以我没有
android.mk文件的内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := baz
LOCAL_SRC_FILES := baz.cpp
include $(BUILD_SHARED_LIBRARY) …Run Code Online (Sandbox Code Playgroud) 这样做合法吗?我想导出一个 C 函数,但在内部该函数将使用一个 C++ 类。
extern "C" BOOL /*BOOL==int*/ Func()
{
return someclass::getinstance()->Func(); // this is just bool tho
}
Run Code Online (Sandbox Code Playgroud)