例如,如果我具有以下功能
void printText(char text [100]){
printf("%d", text);
}
然后我可以在命令行中这样做
printText(Hello World)
然后得到我的预期输出
Hello World
答案 0 :(得分:2)
这取决于您的外壳。一些外壳确实支持功能。在bash
,POSIX Shell以及可能的其他版本中,以下是正确的语法:
printText() {
printf '%s\n' "$1"
}
printText 'Hello World'
如果您的意思是字面上的意思,那么不,即使不提及函数所在的文件,也无法调用该函数。编写该函数所用的语言是无关的。
但是可以编译C函数并以某种方式从shell调用它吗?是。如果从该函数创建了一个共享库(在unixy系统上是共享对象,在Windows上是DLL),则可以。这样做需要工具,但是这样的工具可能会退出。 (Windows还支持COM objects和许多派生技术。其中一些甚至可以使任务更容易。)
(我无法确定此类工具是否确实存在,或者它们是什么,因为在StackOverflow上软件建议不合时宜。我会说这样的工具可以围绕libffi之类的库构建。 )
答案 1 :(得分:1)
一种解决方案是依靠dlopen()
/ LoadLibrary()
和
dlsym()
/ GetProcAddress()
,但您不能确保该功能
原型符合您的期望。
更强大的解决方案在于提供一个填充的查找表 具有您所知道的符合预期用途的功能。
/**
gcc -std=c99 -o prog_c prog_c.c \
-pedantic -Wall -Wextra -Wconversion \
-Wc++-compat -Wwrite-strings -Wold-style-definition -Wvla \
-g -O0 -UNDEBUG -fsanitize=address,undefined
$ ./prog_c printText "Hello world"
printText --> <Hello world>
$ ./prog_c textLen "Hello world"
textLen --> 11
$ ./prog_c what "Hello world"
cannot find function 'what'
**/
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
void
printText(const char *text)
{
printf("printText --> <%s>\n", text);
}
void
textLen(const char *text)
{
printf("textLen --> %d\n", (int)strlen(text));
}
typedef struct
{
const char *name;
void (*fnct)(const char *);
} TextFunction;
bool // success
call_text_function(const char *name,
const char *arg)
{
static TextFunction table[]={ {"printText", printText},
{"textLen", textLen},
{NULL, NULL} };
for(int i=0; table[i].name!=NULL; ++i)
{
if(strcmp(table[i].name, name)==0)
{
table[i].fnct(arg);
return true;
}
}
return false;
}
int
main(int argc,
char **argv)
{
if(argc!=3)
{
fprintf(stderr, "usage: %s function arg\n", argv[0]);
return 1;
}
if(!call_text_function(argv[1], argv[2]))
{
fprintf(stderr, "cannot find function '%s'\n", argv[1]);
return 1;
}
return 0;
}