将匿名参数传递给C中的函数

时间:2018-01-03 21:06:13

标签: c gcc

我可以通过以下方式将参数传递给C中的函数,而不会在ubuntu-64bit上使用gcc发出任何警告或错误:

void func(char* test){
    // do something here
}

void main() {
    func((char*) "smaps");
}

除了关于C ++的类似问题的一个评论之外,我没有找到很多关于将匿名参数传递给C中的函数的示例。我想在我的代码中使用这种技术(很多),它将在多个AMD64 / ARM设备上编译,因为它们可用(主要是基于debian的操作系统)。我的问题是,这是特定于编译器的吗?

输出gcc --version:

$ gcc --version
gcc (Ubuntu 6.3.0-12ubuntu2) 6.3.0 20170406

更新:尽管我认为4386427对我来说已经足够好了,但我会更多地解释这个问题,因为它被搁置了。我有一个脚本,它调用一个特定的函数,它接受一个char **作为参数。我认为我需要单独显式声明一个char **,并在每次调用该函数时通过名称将其传递给函数。我认为声明一个字符串并同时将它传递给该函数会更方便;类似的东西:

func( (char**) {"first_string", "second_string"} ). 

我最初担心的是,这在C中是否允许,或者这是一个特定于编译器的功能? 4386427的回答表明它不是特定于编译器的,但是我应该小心传递给函数的char **是不可变的。

2 个答案:

答案 0 :(得分:2)

C中的所有参数都按值传递。没有关于将值来自的原始对象传递给被调用函数的信息。从这个意义上讲,所有C参数都是匿名的;没有关于调用函数中使用的标识符的信息被传递。

func((char*) "smaps");中,字符串文字"smaps"将转换为指向char的指针。只有指针的值传递给func。这是标准C.

(如果您确实希望将有关对象的信息传递给函数,则必须手动执行此操作。例如,您可以获取对象的地址并将结果指针传递给函数。或者您可以传递数字数组中元素与函数的关系,以及第一个元素的地址。)

(在C中,诸如"smaps"之类的字符串文字会自动转换为指向其第一个字符的指针,因此您无需使用char *强制转换手动转换它们。[此自动转换可以当字符串文字是sizeof_Alignof&的操作数或用于初始化数组时,不会出现。])

答案 1 :(得分:1)

这取决于你在函数中做了什么。只要您不尝试修改test指向的内容,就没有问题。为了表明无法更改,最好添加const

像这样代码很好:

#include <stdio.h>

void func(const char* test){
    printf("%s\n", test);
}

int main(void) {
    func("smaps1");
    func("smaps2");
    func("smaps3");
    func("smaps4");
    return 0;
}

但如果您尝试更改值,请执行以下操作:

void func(char* test){
    test[0] = 'A';
    printf("%s\n", test);
}

您有未定义的行为,因为修改字符串文字是未定义的行为。