gcc c++当"-fpermission"和"-Werror"都打开时,如何禁



对于这个结构和函数:

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