簡體   English   中英

同一個function的兩個名字

[英]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;

在使用時返回分段錯誤。 為什么第二種方法不起作用?

編輯:我通過ctypesPython調用這兩個函數:

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 ,或者labelssymbols


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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM