[英]Two names for the same function
我需要相同 function 的兩個實例(不僅僅是別名)。 絕對有效的一件事是
void writedata(union chip *tempchip, unsigned char *datapos, int datanum)
{
blahblah
}
void writestring(union chip *tempchip, unsigned char *datapos, int datanum)
{
writedata(tempchip, datapos, datanum);
}
這有點傻,因為第二個只是將參數傳遞給第一個。 所以我試着“聰明”地做了一個指針
void writedata(union chip *tempchip, unsigned char *datapos, int datanum)
{
blahblah
}
void (* writestring)(union chip *, unsigned char *, int) = writedata;
在使用時返回分段錯誤。 為什么第二種方法不起作用?
編輯:我通過ctypes
從Python
調用這兩個函數:
writedata = parallel.writedata
writedata.argtypes = [devpointer, POINTER(c_ubyte), c_int]
writestring = parallel.writestring
writestring.argtypes = [devpointer, c_char_p, c_int]
因為我想提供string
s 和byte array
s 作為第二個參數。
我認為有一個解決方案可能適合您。 它實現了您想要的效果,但它是從 linker 而不是您的 C 源中實現的。
我的假設是您正在構建一個用於 Python 的共享庫。如果該假設是正確的,那么您可以執行以下操作。
假設您的共享庫名為libclib1.so
,並且您正在執行類似以下操作來創建它:
gcc -shared mysource.o -o libclib1.so
您可以更改此設置為您的 function 添加別名,如下所示:
gcc -shared mysource.o -Xlinker -defsym=writestring=writedata -o libclib1.so
這將創建一個新符號writestring
,其值與writedata
相同。
當然,如果你有一堆這樣的東西,在命令行上做這件事可能會有問題。 但也有一個解決方案。 您需要做的就是創建一個包含所有別名選項的文件。 例如,您可以將其命名為aliases.txt
。 它看起來像:
-Xlinker -defsym=writestring=writedata
該文件可以包含任意數量的選項,每個選項都在自己的行中。 然后您可以將共享庫鏈接命令更改為:
gcc -shared mysource.o @aliases.txt -o libclib1.so
這將從aliases.txt
中選取選項,將所有需要的別名添加到libclib1.so
中。
我認為您只是想將不同的數據傳遞給單個 function,例如您提出的其他問題。 解決方案是在 Python 端使用一個c_void_p
來接受不同種類的指針。 C 代碼將接收指針並將其視為unsigned char *
。
這是一個示例 DLL,它只關注問題:
測試.c
#include <stdio.h>
__declspec(dllexport)
void func(unsigned char *datapos, size_t length)
{
for(int i = 0; i < length; ++i)
printf("%02hhx ",datapos[i]);
printf("\n");
}
測試.py
from ctypes import *
dll = CDLL('./test')
_func = dll.func
_func.argtypes = c_void_p,c_size_t
_func.restype = None
def func(data):
_func(data,len(data))
test1 = b'\x01\x02\x03'
test2 = (c_ubyte*3)(1,2,3)
func(test1)
func(test2)
Output:
01 02 03
01 02 03
相同 function 的兩個實例:(我認為 OP 想要兩個entry points
,或者labels
或symbols
)
inline static unsigned f0( unsigned aa, unsigned bb)
{
return aa %bb + bb %aa;
}
#if WANT_MAGIC /* not needed, anyway */
#define MAGIC __attribute__ ((noinline))
#else
#define MAGIC /**/
#endif
unsigned MAGIC f1( unsigned aa, unsigned bb)
{
return f0( aa, bb);
}
unsigned MAGIC f2( unsigned aa, unsigned bb)
{
return f0( aa, bb);
}
您可以使 f1 和 f2 函數不同:接受不同的參數類型,並進行適當的轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.