将一些代码从C ++转换为C

可能重复:
C代码编译为C ++,但不是C

编辑:

我重新编译库的来源为C,并修复它。

我有我需要在我的应用程序中使用的代码。 这是为了写入串行端口,我不知道如何让它在C运行。我有一个版本的C + +,以及一个看起来更像是C的版本,旨在与Borland编译C ++ 5.5编译器,但我不能让它在那里或在我的项目编译。

编辑:我应该注意,它编译(和链接)当我编译为C ++,但不是当我编译为C。

这里是我得到的链接器错误:

1>InpoutTest.obj : error LNK2019: unresolved external symbol _Out32@8 referenced in function _main 1>InpoutTest.obj : error LNK2019: unresolved external symbol _Inp32@4 referenced in function _main 

这是c ++代码。 我不需要命令行function,我只需要能够调用Out32()。 我甚至不需要能够阅读。

 #include "stdafx.h" #include "stdio.h" #include "string.h" #include "stdlib.h" /* ----Prototypes of Inp and Outp--- */ short _stdcall Inp32(short PortAddress); void _stdcall Out32(short PortAddress, short data); /*--------------------------------*/ int main(int argc, char* argv[]) { int data; if(argc<3) { //too few command line arguments, show usage printf("Error : too few arguments\n\n***** Usage *****\n\nInpoutTest read <ADDRESS> \nor \nInpoutTest write <ADDRESS> <DATA>\n\n\n\n\n"); } else if(!strcmp(argv[1],"read")) { data = Inp32(atoi(argv[2])); printf("Data read from address %s is %d \n\n\n\n",argv[2],data); } else if(!strcmp(argv[1],"write")) { if(argc<4) { printf("Error in arguments supplied"); printf("\n***** Usage *****\n\nInpoutTest read <ADDRESS> \nor \nInpoutTest write <ADDRESS> <DATA>\n\n\n\n\n"); } else { Out32(atoi(argv[2]),atoi(argv[3])); printf("data written to %s\n\n\n",argv[2]); } } return 0; } 

这是另一个示例:

 #include <stdio.h> #include <conio.h> #include <windows.h> /* Definitions in the build of inpout32.dll are: */ /* short _stdcall Inp32(short PortAddress); */ /* void _stdcall Out32(short PortAddress, short data); */ /* prototype (function typedef) for DLL function Inp32: */ typedef short _stdcall (*inpfuncPtr)(short portaddr); typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum); int main(void) { HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32; short x; int i; /* Load the library */ hLib = LoadLibrary("inpout32.dll"); if (hLib == NULL) { printf("LoadLibrary Failed.\n"); return -1; } /* get the address of the function */ inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); if (inp32 == NULL) { printf("GetProcAddress for Inp32 Failed.\n"); return -1; } oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); if (oup32 == NULL) { printf("GetProcAddress for Oup32 Failed.\n"); return -1; } /***************************************************************/ /* now test the functions */ /* Try to read 0x378..0x37F, LPT1: */ for (i=0x378; (i<0x380); i++) { x = (inp32)(i); printf("port read (%04X)= %04X\n",i,x); } /***** Write the data register */ i=0x378; x=0x77; (oup32)(i,x); printf("port write to 0x%X, datum=0x%2X\n" ,i ,x); /***** And read back to verify */ x = (inp32)(i); printf("port read (%04X)= %04X\n",i,x); /***** One more time, different value */ i=0x378; x=0xAA; (oup32)(i,x); printf("port write to 0x%X, datum=0x%2X\n" ,i ,x); /***** And read back to verify */ x = (inp32)(i); printf("port read (%04X)= %04X\n",i,x); FreeLibrary(hLib); return 0; } 

任何帮助,将不胜感激。

您可能需要用“extern C {/ * … * /}”来包装Inp32 / Outp32的原型。

这段代码看起来像读/写打印机端口,而不是串口。 这是通过加载一些可直接访问硬件的DLL来实现的。 为了得到它的工作,你需要使用相同的(或类似的)DLL。 从外观上看 ,它使用的是Inpout32.dll ,所以这可能会有所帮助。

我必须重新编译C库,然后使用该版本。 现有的版本被编译为C ++。