Fpermissive как исправить

I am including a file from a third-party library that raises an error that can be downgraded to a warning with -fpermissive. But because I do not want to “pollute” my compilation log with these warnings, I want to completely disable this messages.

So far, I set the -fpermissive option with a diagnostic pragma when including the file; something like:

#pragma GCC diagnostic push
#pragma GCC diagnostic warning "-fpermissive"

#include <third-party-file.h>

#pragma GCC diagnostic pop

Since GCC usually provides both a “positive” and “negative” version of the -f flags, I thought about ignoring the “no-permissive” feature:

#pragma GCC diagnostic ignored "-fno-permissive"
#include <third-party-file.h>

But there does not seem to be a “negative” version of the -fpermissive flag (I am using GCC 4.6.3; but even the version 4.7.0 does not have it).

Can I mimic this behavior?

I am trying to compile some nonconforming code in C++17, but I am stuck with the following issue.

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-fpermissive"

Some code that compiles only when with -fpermissive flag is set:

#pragma GCC diagnostic pop

It compiles fine on GCC version 4.6.4 through 4.7.4, but all later versions of GCC are giving me the following warning and don’t suppress the error.

warning: ‘-fpermissive’ is not an option that controls warnings [-Wpragmas]
#pragma GCC diagnostic ignored "-fpermissive"
When I write (out of desperation)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpragmas"
#pragma GCC diagnostic ignored "-fpermissive"

Some code that compiles only when with -fpermissive flag is set:

#pragma GCC diagnostic pop

I am back at square one. Currently I’d like to continue using GCC 7.1 for the project. I can compile the entire project with -fpermissive flag set as a compile option, but this means that some other section of code causing a -fpermissive error could compile.

Condensed example https://godbolt.org/g/KFd5Ke

This question is not a duplicate of In GCC, how can I mute the ‘-fpermissive’ warning? as this is directed toward newer versions of GCC where the solution provided in the aforementioned Stack Overflow question does not work. I even included an example.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <Wire.h>
void setup() {
  IC_Default_Download();
}
 
void SIGMA_WRITE_REGISTER_BLOCK(byte IC_address, word subAddress, int dataLength, byte pdata[]) {
  
  Wire.beginTransmission(IC_address);
  uint8_t addressLowByte = subAddress & 0xff;
  uint8_t addressHighByte = (subAddress >> 8);
 
  Wire.write(addressHighByte); 
  Wire.write(addressLowByte); 
 
  if (dataLength < 50 ) {
    for (int i=0; i<dataLength; i++) { 
      Wire.write(pdata[i]); //write data bytes
    }
  }
  else { 
    for (int i=0; i<dataLength; i++) {
      Wire.write(pgm_read_byte_near(pdata + i)); //write data bytes from PROGMEM (for param and program data)
    }
  }
  Wire.endTransmission();
  
}
 
void IC_Default_Download() {
 
 
  typedef unsigned short ADI_DATA_U16;
  typedef unsigned char  ADI_REG_TYPE;
 
  
 /********************************************************************************************************/
  
  #define DEVICE_ADDR_IC_1                                          0x68  
  #define REG_COREREGISTER_IC_1_ADDR                       0x081C
  #define PROGRAM_ADDR_IC_1                                       0x0400
  #define PARAM_ADDR_IC_1                                           0x0000                   
 
/******************************************************************************************************/
 
  #define REG_COREREGISTER_IC_1_BYTE                      2
  #define R3_HWCONFIGURATION_IC_1_SIZE                 24
  #define PROGRAM_SIZE_IC_1                                      5120
  #define PARAM_SIZE_IC_1                                           4096
                         
/********************************************************************************************************/
 
  ADI_REG_TYPE R0_COREREGISTER_IC_1_Default[REG_COREREGISTER_IC_1_BYTE] = {0x00, 0x18};
  ADI_REG_TYPE R3_HWCONFIGURATION_IC_1_Default[R3_HWCONFIGURATION_IC_1_SIZE] = {0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
  ADI_REG_TYPE R4_COREREGISTER_IC_1_Default[REG_COREREGISTER_IC_1_BYTE] = {0x00, 0x1C};
  
const static ADI_REG_TYPE Program_Data_IC_1[PROGRAM_SIZE_IC_1] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x01, 
0x00, 0x00, 0x00, 0xE8, 0x01, 
0x00, 0x01, 0x08, 0x20, 0x01, 
...........
0x00, 0x00, 0x00, 0x00, 0x01,  
};
 
const static ADI_REG_TYPE Param_Data_IC_1[PARAM_SIZE_IC_1] PROGMEM = { 
0x00, 0x00, 0x0D, 0x6F, 
0x00, 0x00, 0x15, 0xF4, 
0x00, 0x00, 0x12, 0x06, 
0x00, 0x00, 0x15, 0xF4, 
0x00, 0x00, 0x13, 0x01, 
0x00, 0x00, 0x16, 0x48, 
........... 
0x00, 0x00, 0x00, 0x00,  
};
 
  SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, REG_COREREGISTER_IC_1_ADDR, REG_COREREGISTER_IC_1_BYTE, R0_COREREGISTER_IC_1_Default );
  SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PROGRAM_ADDR_IC_1, PROGRAM_SIZE_IC_1, Program_Data_IC_1 );
  SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PARAM_ADDR_IC_1, PARAM_SIZE_IC_1, Param_Data_IC_1 );
  SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, REG_COREREGISTER_IC_1_ADDR , R3_HWCONFIGURATION_IC_1_SIZE, R3_HWCONFIGURATION_IC_1_Default );
  SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, REG_COREREGISTER_IC_1_ADDR, REG_COREREGISTER_IC_1_BYTE, R4_COREREGISTER_IC_1_Default );
}
//-------------------------------------------------------------------------------------------------------------------------------
 
void loop() {
}

Я включаю файл из сторонней библиотеки, который вызывает ошибку, которая может быть понижена до предупреждения с помощью -fpermissive. Но поскольку я не хочу “загрязнять” мой журнал компиляции этими предупреждениями, я хочу полностью отключить эти сообщения.

До сих пор я устанавливал параметр -fpermissive с диагностической прагмой при включении файла; что-то вроде:

#pragma GCC diagnostic push
#pragma GCC diagnostic warning "-fpermissive"

#include <third-party-file.h>

#pragma GCC diagnostic pop

Поскольку gcc обычно предоставляет как “положительную”, так и “отрицательную” версию флагов -f, я думал об игнорировании функции “без разрешающей способности”:

#pragma GCC diagnostic ignored "-fno-permissive"
#include <third-party-file.h>

Но, похоже, не существует “отрицательной” версии флага -fpermissive (я использую gcc 4.6.3, но даже версия 4.7.0 не имеет это).

Есть ли вероятность, что я смогу имитировать это поведение? Спасибо!

Я включаю файл из сторонней библиотеки, который вызывает ошибку, которую можно понизить до предупреждения с помощью -fpermissive. Но поскольку я не хочу “загрязнять” журнал компиляции этими предупреждениями, я хочу полностью отключить эти сообщения.

Пока что я поставил -fpermissive вариант с диагностическая прагма при включении файла; что-то типа:

#pragma GCC diagnostic push
#pragma GCC diagnostic warning "-fpermissive"

#include <third-party-file.h>

#pragma GCC diagnostic pop

Поскольку GCC обычно предоставляет как «положительную», так и «отрицательную» версию -f флаги, я подумал об игнорировании функции «не разрешающая»:

#pragma GCC diagnostic ignored "-fno-permissive"
#include <third-party-file.h>

Но “негативной” версии, похоже, не существует. -fpermissive флаг (я использую GCC 4.6.3, но даже версия 4.7.0 не имеет этого).

Могу ли я имитировать это поведение?

Добавить комментарий