c - 通过基本脚本程序检查 C 语言中是否存在函数
问题描述
我想知道如何通过 bash 脚本编程检查 C 语言程序中是否存在函数。
假设我用 C 语言编写了一个程序:
乐趣.c
void add();
void main() {
add();
}
void add() {
printf"hello");
}
我想通过 bash 脚本检查上述程序功能是否存在?
#!bin/bash ? ? ? ?
解决方案
您可以创建一个临时文件并在其中使用要检查其存在的函数的行:
#!/bin/bash
cp func.c /tmp/func.c # Create temp file
echo "void testAdd() { add(); }" >> /tmp/func.c # Append test line
gcc /tmp/func.c -o /dev/null # Run test
if [ $? -eq 0 ] # Check gcc's exit code
then
echo "function add() exists"
else
echo "Can't find add() or other error"
fi
使用-o /dev/null
gcc 的输出被丢弃。当函数存在且没有其他错误时,gcc 应该通过。否则应该返回一条错误消息并且退出代码$?
不为零:
func.c:10:18: warning: implicit declaration of function ‘add’ [-Wimplicit-function-declaration]
void testAdd() { add(); }
但是,必须始终知道函数签名,否则会出现错误:
func.c:10:18: error: too few arguments to function ‘add’
void testAdd() { add(); }
如果测试不应该依赖于函数签名,则可以使用此测试行:
void testAdd() { void* a = add; }
但是,这里的 add 也可以是全局变量而不是函数。
推荐阅读
- javascript - 没有得到预期的结果 Node Fetch POST
- node.js - Adonis 查询生成器:条件计数
- http - 调用堆栈上的错误处理 - http 请求处理程序
- javascript - getuserMedia() - 不能在 localhost 上工作,因为它的来源不安全?
- javascript - 开发人员工具 - Internet Explorer 与 Chrome - 抓取
- git - 如何将先前的提交移动到分支的头部
- aws-lambda - Windows 10 中的 Serverless.yml AWS Lambda:符号链接文件夹不在最终包中
- xcode - 看不到如何更改应用提交时的年龄等级/使用情况
- typescript - 更新文档我不知道的文档ID云功能
- javascript - 我应该使用 Redux、Context 还是 hooks?以及如何实施