对于这个结构和函数:
typedef struct data_s
{
int i1;
int i2;
} data_t;
void print_data_passed_by_ptr(const data_t *data)
{
printf(" i1 = %in"
" i2 = %inn",
data->i1,
data->i2);
}
这在C:中运行良好
// Print R-value struct passed by ptr
print_data_passed_by_ptr(&(data_t){
.i1 = 7,
.i2 = 8,
});
我的C构建命令是:
gcc -Wall -Wextra -Werror -O3 -std=c17
struct_pass_R_values_by_cpp_reference_and_ptr.c -o bin/a && bin/a
但是,在C++中,失败了
error: taking address of temporary [-fpermissive]
我的C++构建命令是:
g++ -Wall -Wextra -Werror -O3 -std=c++17
struct_pass_R_values_by_cpp_reference_and_ptr.c -o bin/a && bin/a
因此,我在C++构建命令中添加了-fpermissive
:
g++ -Wall -Wextra -Werror -O3 -std=c++17 -fpermissive
struct_pass_R_values_by_cpp_reference_and_ptr.c -o bin/a && bin/a
现在C++构建失败了:
error: taking address of temporary [-Werror=permissive]
我尝试用-Wno-error=permissive
关闭-Werror=permissive
(有关GCC文档,请参阅此处:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html,并在页面中搜索-Wno-error=
(,但这不是一个有效的选项。我尝试的新建cmd:
g++ -Wall -Wextra -Werror -O3 -std=c++17 -fpermissive -Wno-error=permissive
struct_pass_R_values_by_cpp_reference_and_ptr.c -o bin/a && bin/a
失败:
cc1plus: error: -Werror=permissive: no option -Wpermissive
那么,我该如何解决这个问题,迫使这个C代码在C++中构建抑制警告/错误,或者对代码进行一些修改(而不是((如下所示(都是可以接受的答案。我希望代码最终也能编译成C,而不仅仅是C++。
我知道我可以用";const引用";在C++而不是ptr中,就像这样,这很好,它可能会回答别人的问题,但这不是我的问题:
void print_data_passed_by_cpp_reference(const data_t& data)
{
printf(" i1 = %in"
" i2 = %inn",
data.i1,
data.i2);
}
// Print R-value struct passed by C++ reference
print_data_passed_by_cpp_reference({
.i1 = 9,
.i2 = 10,
});
我也知道我可以删除-Werror
并保留-fpermissive
来构建它,并发出如下警告:
eRCaGuy_hello_world/cpp$ g++ -Wall -Wextra -O3 -std=c++17 -fpermissive
struct_pass_R_values_by_cpp_reference_and_ptr.c -o bin/a && bin/a
struct_pass_R_values_by_cpp_reference_and_ptr.c: In function ‘int main()’:
struct_pass_R_values_by_cpp_reference_and_ptr.c:87:5: warning: taking address of temporary [-fpermissive]
});
^
Hello world.
i1 = 7
i2 = 8
i1 = 9
i2 = 10
但我真的很想保持-Werror
,让这个警告消失。
如何将R值参数自动传递到函数中,作为C的const ptr和C的const引用++
(重点添加到我原来的报价中(
那么,我该如何解决这个问题,以迫使这个C代码在C++中构建?抑制警告/错误、或对代码进行一些修改(而不是下面显示的代码(都是可以接受的答案我希望代码最终也能编译成C,而不仅仅是C++。
这很管用!这是一种方法。如果有办法通过命令行选项禁用gcc中的警告/错误,我仍然想知道这些。
我觉得这很聪明。根据语言的不同,它使用print_data()
函数和DATA_T
宏的两个单独定义,通过C的const ptr和C++的const reference传递R值。
#ifndef __cplusplus
// For C
void print_data(const data_t *data)
{
printf(" i1 = %in"
" i2 = %inn",
data->i1,
data->i2);
}
#else
// For C++
void print_data(const data_t& data)
{
printf(" i1 = %in"
" i2 = %inn",
data.i1,
data.i2);
}
#endif
#ifndef __cplusplus
// For C
#define DATA_T &(data_t)
#else
// For C++
#define DATA_T // leave empty
#endif
用法:
// Print R-value struct passed by C++ reference, OR by C ptr, depending on
// whether this code is compiled as C or C++
print_data(DATA_T{
.i1 = 9,
.i2 = 10,
});
构建命令:
# For C
gcc -Wall -Wextra -Werror -O3 -std=c17
struct_pass_R_values_by_cpp_reference_and_ptr.c -o bin/a && bin/a
# For C++
g++ -Wall -Wextra -Werror -O3 -std=c++17
struct_pass_R_values_by_cpp_reference_and_ptr.c -o bin/a && bin/a